mercurial/subrepo.py
author Jun Wu <quark@fb.com>
Thu, 23 Mar 2017 12:01:18 -0700
changeset 31594 4a1bf30f5438
parent 31551 f97e90fa5ad7
child 32005 2406dbba49bd
permissions -rw-r--r--
util: use util.getfstype
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     1
# subrepo.py - sub-repository handling for Mercurial
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     2
#
10324
55d134ef8ab7 subrepo: correct copyright
David Soria Parra <dsp@php.net>
parents: 10299
diff changeset
     3
# Copyright 2009-2010 Matt Mackall <mpm@selenic.com>
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     4
#
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10251
diff changeset
     6
# GNU General Public License version 2 or any later version.
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     7
25980
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
     8
from __future__ import absolute_import
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
     9
23540
f274d27f1994 addremove: automatically process a subrepository's subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 23537
diff changeset
    10
import copy
25980
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    11
import errno
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29243
diff changeset
    12
import hashlib
25980
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    13
import os
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    14
import posixpath
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    15
import re
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    16
import stat
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    17
import subprocess
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    18
import sys
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    19
import tarfile
19788
c26690fe5f08 subrepo: move import of xml.minidom.dom to its own line for check-code
Augie Fackler <raf@durin42.com>
parents: 19637
diff changeset
    20
import xml.dom.minidom
25980
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    21
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    22
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    23
from .i18n import _
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    24
from . import (
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    25
    cmdutil,
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    26
    config,
30635
a150173da1c1 py3: replace os.environ with encoding.environ (part 2 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30615
diff changeset
    27
    encoding,
25980
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    28
    error,
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    29
    exchange,
30060
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
    30
    filemerge,
25980
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    31
    match as matchmod,
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    32
    node,
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    33
    pathutil,
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    34
    phases,
30615
bb77654dc7ae py3: replace os.sep with pycompat.ossep (part 3 of 4)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30060
diff changeset
    35
    pycompat,
25980
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    36
    scmutil,
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    37
    util,
31236
8a0687a2be75 vfs: use 'vfs' module directly in 'mercurial.subrepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31102
diff changeset
    38
    vfs as vfsmod,
25980
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    39
)
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    40
9092
9aebeea7ac00 subrepo: use hg.repository instead of creating localrepo directly
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 9049
diff changeset
    41
hg = None
14050
9e8a9d45945c subrepo: handle svn tracked/unknown directory collisions
Patrick Mezard <pmezard@gmail.com>
parents: 14025
diff changeset
    42
propertycache = util.propertycache
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
    43
10177
5ca0d220ae21 subrepo: add table-based dispatch for subrepo types
Augie Fackler <durin42@gmail.com>
parents: 10175
diff changeset
    44
nullstate = ('', '', 'empty')
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    45
18940
798bdb7f1517 subrepo: do not push mercurial subrepos whose store is clean
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18939
diff changeset
    46
def _expandedabspath(path):
798bdb7f1517 subrepo: do not push mercurial subrepos whose store is clean
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18939
diff changeset
    47
    '''
798bdb7f1517 subrepo: do not push mercurial subrepos whose store is clean
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18939
diff changeset
    48
    get a path or url and if it is a path expand it and return an absolute path
798bdb7f1517 subrepo: do not push mercurial subrepos whose store is clean
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18939
diff changeset
    49
    '''
798bdb7f1517 subrepo: do not push mercurial subrepos whose store is clean
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18939
diff changeset
    50
    expandedpath = util.urllocalpath(util.expandpath(path))
798bdb7f1517 subrepo: do not push mercurial subrepos whose store is clean
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18939
diff changeset
    51
    u = util.url(expandedpath)
798bdb7f1517 subrepo: do not push mercurial subrepos whose store is clean
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18939
diff changeset
    52
    if not u.scheme:
798bdb7f1517 subrepo: do not push mercurial subrepos whose store is clean
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18939
diff changeset
    53
        path = util.normpath(os.path.abspath(u.path))
798bdb7f1517 subrepo: do not push mercurial subrepos whose store is clean
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18939
diff changeset
    54
    return path
18936
1fa4edb8456e subrepo: introduce storeclean helper functions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18851
diff changeset
    55
1fa4edb8456e subrepo: introduce storeclean helper functions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18851
diff changeset
    56
def _getstorehashcachename(remotepath):
1fa4edb8456e subrepo: introduce storeclean helper functions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18851
diff changeset
    57
    '''get a unique filename for the store hash cache of a remote repository'''
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29243
diff changeset
    58
    return hashlib.sha1(_expandedabspath(remotepath)).hexdigest()[0:12]
18936
1fa4edb8456e subrepo: introduce storeclean helper functions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18851
diff changeset
    59
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
    60
class SubrepoAbort(error.Abort):
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
    61
    """Exception class used to avoid handling a subrepo error more than once"""
18263
9aa6bee6e9f9 subrepo: add subrepo property to SubrepoAbort exceptions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18109
diff changeset
    62
    def __init__(self, *args, **kw):
29510
19205a0e2bf1 error: make hintable exceptions reject unknown keyword arguments (API)
Yuya Nishihara <yuya@tcha.org>
parents: 29389
diff changeset
    63
        self.subrepo = kw.pop('subrepo', None)
19205a0e2bf1 error: make hintable exceptions reject unknown keyword arguments (API)
Yuya Nishihara <yuya@tcha.org>
parents: 29389
diff changeset
    64
        self.cause = kw.pop('cause', None)
18296
a74101cd6965 subrepo: fix python2.4 compatibility after 9aa6bee6e9f9
Brendan Cully <brendan@kublai.com>
parents: 18263
diff changeset
    65
        error.Abort.__init__(self, *args, **kw)
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
    66
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
    67
def annotatesubrepoerror(func):
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
    68
    def decoratedmethod(self, *args, **kargs):
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
    69
        try:
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
    70
            res = func(self, *args, **kargs)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
    71
        except SubrepoAbort as ex:
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
    72
            # This exception has already been handled
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
    73
            raise ex
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
    74
        except error.Abort as ex:
18263
9aa6bee6e9f9 subrepo: add subrepo property to SubrepoAbort exceptions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18109
diff changeset
    75
            subrepo = subrelpath(self)
18297
7196f11c5c7d subrepo: make 'in subrepo' string easier to find by external tools
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18296
diff changeset
    76
            errormsg = str(ex) + ' ' + _('(in subrepo %s)') % subrepo
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
    77
            # avoid handling this exception by raising a SubrepoAbort exception
18964
ca480d710fe6 subrepo: chain the original exception to SubrepoAbort
Matt Harbison <matt_harbison@yahoo.com>
parents: 18943
diff changeset
    78
            raise SubrepoAbort(errormsg, hint=ex.hint, subrepo=subrepo,
ca480d710fe6 subrepo: chain the original exception to SubrepoAbort
Matt Harbison <matt_harbison@yahoo.com>
parents: 18943
diff changeset
    79
                               cause=sys.exc_info())
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
    80
        return res
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
    81
    return decoratedmethod
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
    82
11775
a8614c5a5e9a subrepos: support remapping of .hgsub source paths
Martin Geisler <mg@lazybytes.net>
parents: 11572
diff changeset
    83
def state(ctx, ui):
11571
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
    84
    """return a state dict, mapping subrepo paths configured in .hgsub
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
    85
    to tuple: (source from .hgsub, revision from .hgsubstate, kind
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
    86
    (key in types dict))
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
    87
    """
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    88
    p = config.config()
25768
7a9ef8608a1d subrepo: prefetch ctx.repo() for efficiency and centralization
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25660
diff changeset
    89
    repo = ctx.repo()
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    90
    def read(f, sections=None, remap=None):
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    91
        if f in ctx:
13017
d0e21c5fde41 subrepo: handle missing subrepo spec file as removed
Patrick Mezard <pmezard@gmail.com>
parents: 13015
diff changeset
    92
            try:
d0e21c5fde41 subrepo: handle missing subrepo spec file as removed
Patrick Mezard <pmezard@gmail.com>
parents: 13015
diff changeset
    93
                data = ctx[f].data()
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
    94
            except IOError as err:
13017
d0e21c5fde41 subrepo: handle missing subrepo spec file as removed
Patrick Mezard <pmezard@gmail.com>
parents: 13015
diff changeset
    95
                if err.errno != errno.ENOENT:
d0e21c5fde41 subrepo: handle missing subrepo spec file as removed
Patrick Mezard <pmezard@gmail.com>
parents: 13015
diff changeset
    96
                    raise
d0e21c5fde41 subrepo: handle missing subrepo spec file as removed
Patrick Mezard <pmezard@gmail.com>
parents: 13015
diff changeset
    97
                # handle missing subrepo spec files as removed
24645
b39afa36006a subrepo: precisely identify the missing subrepo spec file
Matt Harbison <matt_harbison@yahoo.com>
parents: 24471
diff changeset
    98
                ui.warn(_("warning: subrepo spec file \'%s\' not found\n") %
25769
2538b87660be subrepo: use repo.pathto instead of util.pathto to simplify invocation
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25768
diff changeset
    99
                        repo.pathto(f))
13017
d0e21c5fde41 subrepo: handle missing subrepo spec file as removed
Patrick Mezard <pmezard@gmail.com>
parents: 13015
diff changeset
   100
                return
d0e21c5fde41 subrepo: handle missing subrepo spec file as removed
Patrick Mezard <pmezard@gmail.com>
parents: 13015
diff changeset
   101
            p.parse(f, data, sections, remap, read)
10174
65b6dc44cdbf subrepo: fix includes support in .hgsub
Matt Mackall <mpm@selenic.com>
parents: 10069
diff changeset
   102
        else:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
   103
            raise error.Abort(_("subrepo spec file \'%s\' not found") %
25769
2538b87660be subrepo: use repo.pathto instead of util.pathto to simplify invocation
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25768
diff changeset
   104
                             repo.pathto(f))
10174
65b6dc44cdbf subrepo: fix includes support in .hgsub
Matt Mackall <mpm@selenic.com>
parents: 10069
diff changeset
   105
    if '.hgsub' in ctx:
65b6dc44cdbf subrepo: fix includes support in .hgsub
Matt Mackall <mpm@selenic.com>
parents: 10069
diff changeset
   106
        read('.hgsub')
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   107
11775
a8614c5a5e9a subrepos: support remapping of .hgsub source paths
Martin Geisler <mg@lazybytes.net>
parents: 11572
diff changeset
   108
    for path, src in ui.configitems('subpaths'):
a8614c5a5e9a subrepos: support remapping of .hgsub source paths
Martin Geisler <mg@lazybytes.net>
parents: 11572
diff changeset
   109
        p.set('subpaths', path, src, ui.configsource('subpaths', path))
a8614c5a5e9a subrepos: support remapping of .hgsub source paths
Martin Geisler <mg@lazybytes.net>
parents: 11572
diff changeset
   110
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   111
    rev = {}
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   112
    if '.hgsubstate' in ctx:
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   113
        try:
16596
95ca6c8b38da subrepo: do not traceback on .hgsubstate parsing errors
Patrick Mezard <patrick@mezard.eu>
parents: 16595
diff changeset
   114
            for i, l in enumerate(ctx['.hgsubstate'].data().splitlines()):
16595
2de6ac4ac17c subrepo: ignore blank lines in .hgsubstate (issue3424)
Patrick Mezard <patrick@mezard.eu>
parents: 16555
diff changeset
   115
                l = l.lstrip()
2de6ac4ac17c subrepo: ignore blank lines in .hgsubstate (issue3424)
Patrick Mezard <patrick@mezard.eu>
parents: 16555
diff changeset
   116
                if not l:
2de6ac4ac17c subrepo: ignore blank lines in .hgsubstate (issue3424)
Patrick Mezard <patrick@mezard.eu>
parents: 16555
diff changeset
   117
                    continue
16596
95ca6c8b38da subrepo: do not traceback on .hgsubstate parsing errors
Patrick Mezard <patrick@mezard.eu>
parents: 16595
diff changeset
   118
                try:
95ca6c8b38da subrepo: do not traceback on .hgsubstate parsing errors
Patrick Mezard <patrick@mezard.eu>
parents: 16595
diff changeset
   119
                    revision, path = l.split(" ", 1)
95ca6c8b38da subrepo: do not traceback on .hgsubstate parsing errors
Patrick Mezard <patrick@mezard.eu>
parents: 16595
diff changeset
   120
                except ValueError:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
   121
                    raise error.Abort(_("invalid subrepository revision "
24645
b39afa36006a subrepo: precisely identify the missing subrepo spec file
Matt Harbison <matt_harbison@yahoo.com>
parents: 24471
diff changeset
   122
                                       "specifier in \'%s\' line %d")
25769
2538b87660be subrepo: use repo.pathto instead of util.pathto to simplify invocation
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25768
diff changeset
   123
                                     % (repo.pathto('.hgsubstate'), (i + 1)))
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   124
                rev[path] = revision
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
   125
        except IOError as err:
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   126
            if err.errno != errno.ENOENT:
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   127
                raise
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   128
15149
eaec9cf91aea subrepo: refactor state function
Martin Geisler <mg@aragost.com>
parents: 15061
diff changeset
   129
    def remap(src):
11775
a8614c5a5e9a subrepos: support remapping of .hgsub source paths
Martin Geisler <mg@lazybytes.net>
parents: 11572
diff changeset
   130
        for pattern, repl in p.items('subpaths'):
11961
f3075ffa6b30 subrepos: handle backslashes in subpaths
Martin Geisler <mg@lazybytes.net>
parents: 11775
diff changeset
   131
            # Turn r'C:\foo\bar' into r'C:\\foo\\bar' since re.sub
f3075ffa6b30 subrepos: handle backslashes in subpaths
Martin Geisler <mg@lazybytes.net>
parents: 11775
diff changeset
   132
            # does a string decode.
31451
53865692a354 util: wrap s.encode('string_escape') call for future py3 compatibility
Yuya Nishihara <yuya@tcha.org>
parents: 31325
diff changeset
   133
            repl = util.escapestr(repl)
11961
f3075ffa6b30 subrepos: handle backslashes in subpaths
Martin Geisler <mg@lazybytes.net>
parents: 11775
diff changeset
   134
            # However, we still want to allow back references to go
f3075ffa6b30 subrepos: handle backslashes in subpaths
Martin Geisler <mg@lazybytes.net>
parents: 11775
diff changeset
   135
            # through unharmed, so we turn r'\\1' into r'\1'. Again,
f3075ffa6b30 subrepos: handle backslashes in subpaths
Martin Geisler <mg@lazybytes.net>
parents: 11775
diff changeset
   136
            # extra escapes are needed because re.sub string decodes.
f3075ffa6b30 subrepos: handle backslashes in subpaths
Martin Geisler <mg@lazybytes.net>
parents: 11775
diff changeset
   137
            repl = re.sub(r'\\\\([0-9]+)', r'\\\1', repl)
11775
a8614c5a5e9a subrepos: support remapping of .hgsub source paths
Martin Geisler <mg@lazybytes.net>
parents: 11572
diff changeset
   138
            try:
a8614c5a5e9a subrepos: support remapping of .hgsub source paths
Martin Geisler <mg@lazybytes.net>
parents: 11572
diff changeset
   139
                src = re.sub(pattern, repl, src, 1)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
   140
            except re.error as e:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
   141
                raise error.Abort(_("bad subrepository pattern in %s: %s")
11775
a8614c5a5e9a subrepos: support remapping of .hgsub source paths
Martin Geisler <mg@lazybytes.net>
parents: 11572
diff changeset
   142
                                 % (p.source('subpaths', pattern), e))
15149
eaec9cf91aea subrepo: refactor state function
Martin Geisler <mg@aragost.com>
parents: 15061
diff changeset
   143
        return src
11775
a8614c5a5e9a subrepos: support remapping of .hgsub source paths
Martin Geisler <mg@lazybytes.net>
parents: 11572
diff changeset
   144
15149
eaec9cf91aea subrepo: refactor state function
Martin Geisler <mg@aragost.com>
parents: 15061
diff changeset
   145
    state = {}
eaec9cf91aea subrepo: refactor state function
Martin Geisler <mg@aragost.com>
parents: 15061
diff changeset
   146
    for path, src in p[''].items():
eaec9cf91aea subrepo: refactor state function
Martin Geisler <mg@aragost.com>
parents: 15061
diff changeset
   147
        kind = 'hg'
eaec9cf91aea subrepo: refactor state function
Martin Geisler <mg@aragost.com>
parents: 15061
diff changeset
   148
        if src.startswith('['):
eaec9cf91aea subrepo: refactor state function
Martin Geisler <mg@aragost.com>
parents: 15061
diff changeset
   149
            if ']' not in src:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
   150
                raise error.Abort(_('missing ] in subrepo source'))
15149
eaec9cf91aea subrepo: refactor state function
Martin Geisler <mg@aragost.com>
parents: 15061
diff changeset
   151
            kind, src = src.split(']', 1)
eaec9cf91aea subrepo: refactor state function
Martin Geisler <mg@aragost.com>
parents: 15061
diff changeset
   152
            kind = kind[1:]
15150
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   153
            src = src.lstrip() # strip any extra whitespace after ']'
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   154
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   155
        if not util.url(src).isabs():
25768
7a9ef8608a1d subrepo: prefetch ctx.repo() for efficiency and centralization
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25660
diff changeset
   156
            parent = _abssource(repo, abort=False)
15150
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   157
            if parent:
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   158
                parent = util.url(parent)
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   159
                parent.path = posixpath.join(parent.path or '', src)
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   160
                parent.path = posixpath.normpath(parent.path)
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   161
                joined = str(parent)
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   162
                # Remap the full joined path and use it if it changes,
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   163
                # else remap the original source.
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   164
                remapped = remap(joined)
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   165
                if remapped == joined:
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   166
                    src = remap(src)
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   167
                else:
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   168
                    src = remapped
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   169
15149
eaec9cf91aea subrepo: refactor state function
Martin Geisler <mg@aragost.com>
parents: 15061
diff changeset
   170
        src = remap(src)
15723
1581da01d5c4 windows: use normalized path as path to subrepo
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15531
diff changeset
   171
        state[util.pconvert(path)] = (src.strip(), rev.get(path, ''), kind)
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   172
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   173
    return state
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   174
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   175
def writestate(repo, state):
11571
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
   176
    """rewrite .hgsubstate in (outer) repo with these subrepo states"""
24858
a99931201d1b subrepo: don't write .hgsubstate lines with empty subrepo state (issue4622)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24786
diff changeset
   177
    lines = ['%s %s\n' % (state[s][1], s) for s in sorted(state)
a99931201d1b subrepo: don't write .hgsubstate lines with empty subrepo state (issue4622)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24786
diff changeset
   178
                                                if state[s][1] != nullstate[1]]
14443
6fe6defdc924 subrepo: refactor writestate for clarity
Martin Geisler <mg@aragost.com>
parents: 14440
diff changeset
   179
    repo.wwrite('.hgsubstate', ''.join(lines), '')
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   180
30060
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   181
def submerge(repo, wctx, mctx, actx, overwrite, labels=None):
11571
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
   182
    """delegated from merge.applyupdates: merging of .hgsubstate file
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
   183
    in working context, merging context and ancestor context"""
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   184
    if mctx == actx: # backwards?
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   185
        actx = wctx.p1()
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   186
    s1 = wctx.substate
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   187
    s2 = mctx.substate
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   188
    sa = actx.substate
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   189
    sm = {}
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   190
9782
c1c40511c276 subrepo: add more debugging output, lose _ markers
Matt Mackall <mpm@selenic.com>
parents: 9781
diff changeset
   191
    repo.ui.debug("subrepo merge %s %s %s\n" % (wctx, mctx, actx))
c1c40511c276 subrepo: add more debugging output, lose _ markers
Matt Mackall <mpm@selenic.com>
parents: 9781
diff changeset
   192
9779
58a6f3f4d553 subrepo: add some debug output to submerge
Matt Mackall <mpm@selenic.com>
parents: 9752
diff changeset
   193
    def debug(s, msg, r=""):
58a6f3f4d553 subrepo: add some debug output to submerge
Matt Mackall <mpm@selenic.com>
parents: 9752
diff changeset
   194
        if r:
10177
5ca0d220ae21 subrepo: add table-based dispatch for subrepo types
Augie Fackler <durin42@gmail.com>
parents: 10175
diff changeset
   195
            r = "%s:%s:%s" % r
9782
c1c40511c276 subrepo: add more debugging output, lose _ markers
Matt Mackall <mpm@selenic.com>
parents: 9781
diff changeset
   196
        repo.ui.debug("  subrepo %s: %s %s\n" % (s, msg, r))
9779
58a6f3f4d553 subrepo: add some debug output to submerge
Matt Mackall <mpm@selenic.com>
parents: 9752
diff changeset
   197
31516
2915cc1d3429 subrepo: move prompts out of the if (issue5505)
Simon Farnsworth <simonfar@fb.com>
parents: 30755
diff changeset
   198
    promptssrc = filemerge.partextras(labels)
18364
6252b4f1c4b4 subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 18297
diff changeset
   199
    for s, l in sorted(s1.iteritems()):
31516
2915cc1d3429 subrepo: move prompts out of the if (issue5505)
Simon Farnsworth <simonfar@fb.com>
parents: 30755
diff changeset
   200
        prompts = None
11470
34e33d50c26b subrepo: correctly handle update -C with modified subrepos (issue2022)
Matt Mackall <mpm@selenic.com>
parents: 11463
diff changeset
   201
        a = sa.get(s, nullstate)
11463
f0ea93557133 subrepo: fix recording of + in .hgsubstate (issue2217)
Matt Mackall <mpm@selenic.com>
parents: 11455
diff changeset
   202
        ld = l # local state with possible dirty flag for compares
11470
34e33d50c26b subrepo: correctly handle update -C with modified subrepos (issue2022)
Matt Mackall <mpm@selenic.com>
parents: 11463
diff changeset
   203
        if wctx.sub(s).dirty():
11463
f0ea93557133 subrepo: fix recording of + in .hgsubstate (issue2217)
Matt Mackall <mpm@selenic.com>
parents: 11455
diff changeset
   204
            ld = (l[0], l[1] + "+")
11470
34e33d50c26b subrepo: correctly handle update -C with modified subrepos (issue2022)
Matt Mackall <mpm@selenic.com>
parents: 11463
diff changeset
   205
        if wctx == actx: # overwrite
34e33d50c26b subrepo: correctly handle update -C with modified subrepos (issue2022)
Matt Mackall <mpm@selenic.com>
parents: 11463
diff changeset
   206
            a = ld
11463
f0ea93557133 subrepo: fix recording of + in .hgsubstate (issue2217)
Matt Mackall <mpm@selenic.com>
parents: 11455
diff changeset
   207
31516
2915cc1d3429 subrepo: move prompts out of the if (issue5505)
Simon Farnsworth <simonfar@fb.com>
parents: 30755
diff changeset
   208
        prompts = promptssrc.copy()
2915cc1d3429 subrepo: move prompts out of the if (issue5505)
Simon Farnsworth <simonfar@fb.com>
parents: 30755
diff changeset
   209
        prompts['s'] = s
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   210
        if s in s2:
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   211
            r = s2[s]
11463
f0ea93557133 subrepo: fix recording of + in .hgsubstate (issue2217)
Matt Mackall <mpm@selenic.com>
parents: 11455
diff changeset
   212
            if ld == r or r == a: # no change or local is newer
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   213
                sm[s] = l
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   214
                continue
11463
f0ea93557133 subrepo: fix recording of + in .hgsubstate (issue2217)
Matt Mackall <mpm@selenic.com>
parents: 11455
diff changeset
   215
            elif ld == a: # other side changed
9782
c1c40511c276 subrepo: add more debugging output, lose _ markers
Matt Mackall <mpm@selenic.com>
parents: 9781
diff changeset
   216
                debug(s, "other changed, get", r)
13322
c19b9282d3a7 subrepo: make update -C clean the working directory for svn subrepos
Erik Zielke <ez@aragost.com>
parents: 13287
diff changeset
   217
                wctx.sub(s).get(r, overwrite)
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   218
                sm[s] = r
11463
f0ea93557133 subrepo: fix recording of + in .hgsubstate (issue2217)
Matt Mackall <mpm@selenic.com>
parents: 11455
diff changeset
   219
            elif ld[0] != r[0]: # sources differ
30060
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   220
                prompts['lo'] = l[0]
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   221
                prompts['ro'] = r[0]
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8997
diff changeset
   222
                if repo.ui.promptchoice(
30060
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   223
                    _(' subrepository sources for %(s)s differ\n'
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   224
                      'use (l)ocal%(l)s source (%(lo)s)'
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   225
                      ' or (r)emote%(o)s source (%(ro)s)?'
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   226
                      '$$ &Local $$ &Remote') % prompts, 0):
9782
c1c40511c276 subrepo: add more debugging output, lose _ markers
Matt Mackall <mpm@selenic.com>
parents: 9781
diff changeset
   227
                    debug(s, "prompt changed, get", r)
13322
c19b9282d3a7 subrepo: make update -C clean the working directory for svn subrepos
Erik Zielke <ez@aragost.com>
parents: 13287
diff changeset
   228
                    wctx.sub(s).get(r, overwrite)
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   229
                    sm[s] = r
11463
f0ea93557133 subrepo: fix recording of + in .hgsubstate (issue2217)
Matt Mackall <mpm@selenic.com>
parents: 11455
diff changeset
   230
            elif ld[1] == a[1]: # local side is unchanged
9782
c1c40511c276 subrepo: add more debugging output, lose _ markers
Matt Mackall <mpm@selenic.com>
parents: 9781
diff changeset
   231
                debug(s, "other side changed, get", r)
13322
c19b9282d3a7 subrepo: make update -C clean the working directory for svn subrepos
Erik Zielke <ez@aragost.com>
parents: 13287
diff changeset
   232
                wctx.sub(s).get(r, overwrite)
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   233
                sm[s] = r
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   234
            else:
19811
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   235
                debug(s, "both sides changed")
21401
2c364f7801c8 subrepo: use subrepo shortid method to generate subrepo diverged promptchoice
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21400
diff changeset
   236
                srepo = wctx.sub(s)
30060
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   237
                prompts['sl'] = srepo.shortid(l[1])
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   238
                prompts['sr'] = srepo.shortid(r[1])
19811
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   239
                option = repo.ui.promptchoice(
30060
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   240
                    _(' subrepository %(s)s diverged (local revision: %(sl)s, '
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   241
                      'remote revision: %(sr)s)\n'
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   242
                      '(M)erge, keep (l)ocal%(l)s or keep (r)emote%(o)s?'
19811
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   243
                      '$$ &Merge $$ &Local $$ &Remote')
30060
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   244
                    % prompts, 0)
19811
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   245
                if option == 0:
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   246
                    wctx.sub(s).merge(r)
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   247
                    sm[s] = l
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   248
                    debug(s, "merge with", r)
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   249
                elif option == 1:
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   250
                    sm[s] = l
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   251
                    debug(s, "keep local subrepo revision", l)
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   252
                else:
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   253
                    wctx.sub(s).get(r, overwrite)
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   254
                    sm[s] = r
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   255
                    debug(s, "get remote subrepo revision", r)
11463
f0ea93557133 subrepo: fix recording of + in .hgsubstate (issue2217)
Matt Mackall <mpm@selenic.com>
parents: 11455
diff changeset
   256
        elif ld == a: # remote removed, local unchanged
9782
c1c40511c276 subrepo: add more debugging output, lose _ markers
Matt Mackall <mpm@selenic.com>
parents: 9781
diff changeset
   257
            debug(s, "remote removed, remove")
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   258
            wctx.sub(s).remove()
14417
25137d99a5ed subrepo: handle local added subrepo case correctly
Matt Mackall <mpm@selenic.com>
parents: 14316
diff changeset
   259
        elif a == nullstate: # not present in remote or ancestor
25137d99a5ed subrepo: handle local added subrepo case correctly
Matt Mackall <mpm@selenic.com>
parents: 14316
diff changeset
   260
            debug(s, "local added, keep")
25137d99a5ed subrepo: handle local added subrepo case correctly
Matt Mackall <mpm@selenic.com>
parents: 14316
diff changeset
   261
            sm[s] = l
25137d99a5ed subrepo: handle local added subrepo case correctly
Matt Mackall <mpm@selenic.com>
parents: 14316
diff changeset
   262
            continue
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   263
        else:
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8997
diff changeset
   264
            if repo.ui.promptchoice(
30060
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   265
                _(' local%(l)s changed subrepository %(s)s'
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   266
                  ' which remote%(o)s removed\n'
19226
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 19156
diff changeset
   267
                  'use (c)hanged version or (d)elete?'
30060
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   268
                  '$$ &Changed $$ &Delete') % prompts, 0):
9782
c1c40511c276 subrepo: add more debugging output, lose _ markers
Matt Mackall <mpm@selenic.com>
parents: 9781
diff changeset
   269
                debug(s, "prompt remove")
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   270
                wctx.sub(s).remove()
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   271
13857
ba1f98f877ec subrepo: process merge substate in sorted order in submerge()
Adrian Buehlmann <adrian@cadifra.com>
parents: 13771
diff changeset
   272
    for s, r in sorted(s2.items()):
31516
2915cc1d3429 subrepo: move prompts out of the if (issue5505)
Simon Farnsworth <simonfar@fb.com>
parents: 30755
diff changeset
   273
        prompts = None
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   274
        if s in s1:
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   275
            continue
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   276
        elif s not in sa:
9782
c1c40511c276 subrepo: add more debugging output, lose _ markers
Matt Mackall <mpm@selenic.com>
parents: 9781
diff changeset
   277
            debug(s, "remote added, get", r)
10175
fc32b2fc468e subrepo: load from a context where the subrepo exists
Augie Fackler <durin42@gmail.com>
parents: 10174
diff changeset
   278
            mctx.sub(s).get(r)
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   279
            sm[s] = r
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   280
        elif r != sa[s]:
31516
2915cc1d3429 subrepo: move prompts out of the if (issue5505)
Simon Farnsworth <simonfar@fb.com>
parents: 30755
diff changeset
   281
            prompts = promptssrc.copy()
2915cc1d3429 subrepo: move prompts out of the if (issue5505)
Simon Farnsworth <simonfar@fb.com>
parents: 30755
diff changeset
   282
            prompts['s'] = s
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8997
diff changeset
   283
            if repo.ui.promptchoice(
30060
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   284
                _(' remote%(o)s changed subrepository %(s)s'
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   285
                  ' which local%(l)s removed\n'
19226
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 19156
diff changeset
   286
                  'use (c)hanged version or (d)elete?'
30060
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   287
                  '$$ &Changed $$ &Delete') % prompts, 0) == 0:
9782
c1c40511c276 subrepo: add more debugging output, lose _ markers
Matt Mackall <mpm@selenic.com>
parents: 9781
diff changeset
   288
                debug(s, "prompt recreate", r)
24110
756c5c8331b0 subrepo: add tests for change/remove conflicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 23963
diff changeset
   289
                mctx.sub(s).get(r)
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   290
                sm[s] = r
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   291
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   292
    # record merged .hgsubstate
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   293
    writestate(repo, sm)
19637
cc338115d3b2 subrepo: make submerge() return the merged substate
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19226
diff changeset
   294
    return sm
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   295
13417
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   296
def _updateprompt(ui, sub, dirty, local, remote):
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   297
    if dirty:
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   298
        msg = (_(' subrepository sources for %s differ\n'
22590
d4c972b97fee subrepo: remove superfluous newline from subrepo prompt
Mads Kiilerich <madski@unity3d.com>
parents: 21891
diff changeset
   299
                 'use (l)ocal source (%s) or (r)emote source (%s)?'
19226
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 19156
diff changeset
   300
                 '$$ &Local $$ &Remote')
13417
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   301
               % (subrelpath(sub), local, remote))
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   302
    else:
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16596
diff changeset
   303
        msg = (_(' subrepository sources for %s differ (in checked out '
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16596
diff changeset
   304
                 'version)\n'
22590
d4c972b97fee subrepo: remove superfluous newline from subrepo prompt
Mads Kiilerich <madski@unity3d.com>
parents: 21891
diff changeset
   305
                 'use (l)ocal source (%s) or (r)emote source (%s)?'
19226
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 19156
diff changeset
   306
                 '$$ &Local $$ &Remote')
13417
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   307
               % (subrelpath(sub), local, remote))
19226
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 19156
diff changeset
   308
    return ui.promptchoice(msg, 0)
13417
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   309
24785
39f519be5e65 subrepo: backout 93b0e0db7929 to restore reporelpath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24778
diff changeset
   310
def reporelpath(repo):
39f519be5e65 subrepo: backout 93b0e0db7929 to restore reporelpath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24778
diff changeset
   311
    """return path to this (sub)repo as seen from outermost repo"""
39f519be5e65 subrepo: backout 93b0e0db7929 to restore reporelpath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24778
diff changeset
   312
    parent = repo
39f519be5e65 subrepo: backout 93b0e0db7929 to restore reporelpath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24778
diff changeset
   313
    while util.safehasattr(parent, '_subparent'):
39f519be5e65 subrepo: backout 93b0e0db7929 to restore reporelpath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24778
diff changeset
   314
        parent = parent._subparent
39f519be5e65 subrepo: backout 93b0e0db7929 to restore reporelpath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24778
diff changeset
   315
    return repo.root[len(pathutil.normasprefix(parent.root)):]
39f519be5e65 subrepo: backout 93b0e0db7929 to restore reporelpath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24778
diff changeset
   316
12752
18b5b6392fcf subrepo: rename relpath to subrelpath and introduce reporelpath
Mads Kiilerich <mads@kiilerich.com>
parents: 12506
diff changeset
   317
def subrelpath(sub):
11571
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
   318
    """return path to this subrepo as seen from outermost repo"""
24673
105758d1b37b subrepo: add _relpath field to centralize subrelpath logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24672
diff changeset
   319
    return sub._relpath
11112
4a9bee613737 subrepo: print paths relative to upper repo root for push/pull/commit
Edouard Gomez <ed.gomez@free.fr>
parents: 11111
diff changeset
   320
12753
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   321
def _abssource(repo, push=False, abort=True):
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   322
    """return pull/push path of repo - either based on parent repo .hgsub info
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   323
    or on the top repo config. Abort or return None if no source found."""
14963
c035f1c53e39 subrepo: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14898
diff changeset
   324
    if util.safehasattr(repo, '_subparent'):
14076
924c82157d46 url: move URL parsing functions into util to improve startup time
Brodie Rao <brodie@bitheap.org>
parents: 14052
diff changeset
   325
        source = util.url(repo._subsource)
14766
4f56b7530eab subrepos: be smarter about what's an absolute path (issue2808)
Matt Mackall <mpm@selenic.com>
parents: 14664
diff changeset
   326
        if source.isabs():
4f56b7530eab subrepos: be smarter about what's an absolute path (issue2808)
Matt Mackall <mpm@selenic.com>
parents: 14664
diff changeset
   327
            return str(source)
13771
ce6227306c9a subrepos: use url.url when normalizing repo paths
Brodie Rao <brodie@bitheap.org>
parents: 13753
diff changeset
   328
        source.path = posixpath.normpath(source.path)
12753
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   329
        parent = _abssource(repo._subparent, push, abort=False)
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   330
        if parent:
15498
ac5a340b26de subrepo: use correct paths for subrepos with ..-relative paths on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15287
diff changeset
   331
            parent = util.url(util.pconvert(parent))
15055
d629f1e89021 subrepo: fix cloning of repos from urls without slash after host (issue2970)
Mads Kiilerich <mads@kiilerich.com>
parents: 14994
diff changeset
   332
            parent.path = posixpath.join(parent.path or '', source.path)
13771
ce6227306c9a subrepos: use url.url when normalizing repo paths
Brodie Rao <brodie@bitheap.org>
parents: 13753
diff changeset
   333
            parent.path = posixpath.normpath(parent.path)
ce6227306c9a subrepos: use url.url when normalizing repo paths
Brodie Rao <brodie@bitheap.org>
parents: 13753
diff changeset
   334
            return str(parent)
12753
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   335
    else: # recursion reached top repo
14963
c035f1c53e39 subrepo: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14898
diff changeset
   336
        if util.safehasattr(repo, '_subtoppath'):
12852
5dbff89cf107 subrepo: propagate non-default pull/push path to relative subrepos (issue1852)
Mads Kiilerich <mads@kiilerich.com>
parents: 12799
diff changeset
   337
            return repo._subtoppath
12753
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   338
        if push and repo.ui.config('paths', 'default-push'):
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   339
            return repo.ui.config('paths', 'default-push')
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   340
        if repo.ui.config('paths', 'default'):
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   341
            return repo.ui.config('paths', 'default')
23666
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23580
diff changeset
   342
        if repo.shared():
18510
f254ab6207ae subrepo: use sharepath if available when locating the source repo
Matt Harbison <matt_harbison@yahoo.com>
parents: 18364
diff changeset
   343
            # chop off the .hg component to get the default path form
f254ab6207ae subrepo: use sharepath if available when locating the source repo
Matt Harbison <matt_harbison@yahoo.com>
parents: 18364
diff changeset
   344
            return os.path.dirname(repo.sharedpath)
12753
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   345
    if abort:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
   346
        raise error.Abort(_("default path for subrepository not found"))
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   347
24724
95eb067b2b5e subrepo: pass wvfs to _sanitize instead of absolute path to a subrepository
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24695
diff changeset
   348
def _sanitize(ui, vfs, ignore):
24726
747748766421 subrepo: use vfs.walk instead of os.walk
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24724
diff changeset
   349
    for dirname, dirs, names in vfs.walk():
21567
5900bc09e684 subrepo: avoid sanitizing ".hg/hgrc" in meta data area for non-hg subrepos
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21566
diff changeset
   350
        for i, d in enumerate(dirs):
5900bc09e684 subrepo: avoid sanitizing ".hg/hgrc" in meta data area for non-hg subrepos
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21566
diff changeset
   351
            if d.lower() == ignore:
5900bc09e684 subrepo: avoid sanitizing ".hg/hgrc" in meta data area for non-hg subrepos
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21566
diff changeset
   352
                del dirs[i]
5900bc09e684 subrepo: avoid sanitizing ".hg/hgrc" in meta data area for non-hg subrepos
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21566
diff changeset
   353
                break
25771
a7178d8fe7ee subrepo: use vfs.basename instead of os.path.basename
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25769
diff changeset
   354
        if vfs.basename(dirname).lower() != '.hg':
21564
2e91d4964ecd subrepo: make "_sanitize()" work
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
   355
            continue
20104
224e96078708 subrepo: sanitize non-hg subrepos
Matt Mackall <mpm@selenic.com>
parents: 19811
diff changeset
   356
        for f in names:
224e96078708 subrepo: sanitize non-hg subrepos
Matt Mackall <mpm@selenic.com>
parents: 19811
diff changeset
   357
            if f.lower() == 'hgrc':
21564
2e91d4964ecd subrepo: make "_sanitize()" work
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
   358
                ui.warn(_("warning: removing potentially hostile 'hgrc' "
24726
747748766421 subrepo: use vfs.walk instead of os.walk
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24724
diff changeset
   359
                          "in '%s'\n") % vfs.join(dirname))
747748766421 subrepo: use vfs.walk instead of os.walk
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24724
diff changeset
   360
                vfs.unlink(vfs.reljoin(dirname, f))
20104
224e96078708 subrepo: sanitize non-hg subrepos
Matt Mackall <mpm@selenic.com>
parents: 19811
diff changeset
   361
29021
92d37fb3f1aa verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28949
diff changeset
   362
def subrepo(ctx, path, allowwdir=False, allowcreate=True):
11571
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
   363
    """return instance of the right subrepo class for subrepo in path"""
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   364
    # subrepo inherently violates our import layering rules
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   365
    # because it wants to make repo objects from deep inside the stack
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   366
    # so we manually delay the circular imports to not break
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   367
    # scripts that don't use our demand-loading
9092
9aebeea7ac00 subrepo: use hg.repository instead of creating localrepo directly
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 9049
diff changeset
   368
    global hg
25980
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
   369
    from . import hg as h
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   370
    hg = h
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   371
24302
6e092ea2eff1 subrepo: replace 'ctx._repo' with 'ctx.repo()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24256
diff changeset
   372
    pathutil.pathauditor(ctx.repo().root)(path)
16756
2e3513e7348a subrepo: make subrepo.subrepo(<not a subrepo path>) fail
Dov Feldstern <dfeldstern@gmail.com>
parents: 16683
diff changeset
   373
    state = ctx.substate[path]
10177
5ca0d220ae21 subrepo: add table-based dispatch for subrepo types
Augie Fackler <durin42@gmail.com>
parents: 10175
diff changeset
   374
    if state[2] not in types:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
   375
        raise error.Abort(_('unknown subrepo type %s') % state[2])
25600
70ac1868b707 subrepo: allow a representation of the working directory subrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 25591
diff changeset
   376
    if allowwdir:
70ac1868b707 subrepo: allow a representation of the working directory subrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 25591
diff changeset
   377
        state = (state[0], ctx.subrev(path), state[2])
29021
92d37fb3f1aa verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28949
diff changeset
   378
    return types[state[2]](ctx, path, state[:2], allowcreate)
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   379
25416
c4a92867c048 subrepo: introduce the nullsubrepo() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25228
diff changeset
   380
def nullsubrepo(ctx, path, pctx):
c4a92867c048 subrepo: introduce the nullsubrepo() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25228
diff changeset
   381
    """return an empty subrepo in pctx for the extant subrepo in ctx"""
c4a92867c048 subrepo: introduce the nullsubrepo() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25228
diff changeset
   382
    # subrepo inherently violates our import layering rules
c4a92867c048 subrepo: introduce the nullsubrepo() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25228
diff changeset
   383
    # because it wants to make repo objects from deep inside the stack
c4a92867c048 subrepo: introduce the nullsubrepo() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25228
diff changeset
   384
    # so we manually delay the circular imports to not break
c4a92867c048 subrepo: introduce the nullsubrepo() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25228
diff changeset
   385
    # scripts that don't use our demand-loading
c4a92867c048 subrepo: introduce the nullsubrepo() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25228
diff changeset
   386
    global hg
25980
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
   387
    from . import hg as h
25416
c4a92867c048 subrepo: introduce the nullsubrepo() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25228
diff changeset
   388
    hg = h
c4a92867c048 subrepo: introduce the nullsubrepo() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25228
diff changeset
   389
c4a92867c048 subrepo: introduce the nullsubrepo() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25228
diff changeset
   390
    pathutil.pathauditor(ctx.repo().root)(path)
c4a92867c048 subrepo: introduce the nullsubrepo() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25228
diff changeset
   391
    state = ctx.substate[path]
c4a92867c048 subrepo: introduce the nullsubrepo() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25228
diff changeset
   392
    if state[2] not in types:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
   393
        raise error.Abort(_('unknown subrepo type %s') % state[2])
25416
c4a92867c048 subrepo: introduce the nullsubrepo() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25228
diff changeset
   394
    subrev = ''
c4a92867c048 subrepo: introduce the nullsubrepo() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25228
diff changeset
   395
    if state[2] == 'hg':
c4a92867c048 subrepo: introduce the nullsubrepo() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25228
diff changeset
   396
        subrev = "0" * 40
29021
92d37fb3f1aa verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28949
diff changeset
   397
    return types[state[2]](pctx, path, (state[0], subrev), True)
25416
c4a92867c048 subrepo: introduce the nullsubrepo() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25228
diff changeset
   398
20176
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   399
def newcommitphase(ui, ctx):
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   400
    commitphase = phases.newcommitphase(ui)
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   401
    substate = getattr(ctx, "substate", None)
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   402
    if not substate:
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   403
        return commitphase
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   404
    check = ui.config('phases', 'checksubrepos', 'follow')
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   405
    if check not in ('ignore', 'follow', 'abort'):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
   406
        raise error.Abort(_('invalid phases.checksubrepos configuration: %s')
20176
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   407
                         % (check))
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   408
    if check == 'ignore':
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   409
        return commitphase
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   410
    maxphase = phases.public
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   411
    maxsub = None
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   412
    for s in sorted(substate):
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   413
        sub = ctx.sub(s)
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   414
        subphase = sub.phase(substate[s][1])
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   415
        if maxphase < subphase:
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   416
            maxphase = subphase
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   417
            maxsub = s
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   418
    if commitphase < maxphase:
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   419
        if check == 'abort':
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
   420
            raise error.Abort(_("can't commit in %s phase"
20176
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   421
                               " conflicting %s from subrepository %s") %
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   422
                             (phases.phasenames[commitphase],
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   423
                              phases.phasenames[maxphase], maxsub))
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   424
        ui.warn(_("warning: changes are committed in"
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   425
                  " %s phase from subrepository %s\n") %
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   426
                (phases.phasenames[maxphase], maxsub))
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   427
        return maxphase
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   428
    return commitphase
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   429
11559
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   430
# subrepo classes need to implement the following abstract class:
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   431
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   432
class abstractsubrepo(object):
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   433
24671
98ab035e9332 subrepo: change arguments of abstractsubrepo.__init__ (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24645
diff changeset
   434
    def __init__(self, ctx, path):
98ab035e9332 subrepo: change arguments of abstractsubrepo.__init__ (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24645
diff changeset
   435
        """Initialize abstractsubrepo part
98ab035e9332 subrepo: change arguments of abstractsubrepo.__init__ (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24645
diff changeset
   436
98ab035e9332 subrepo: change arguments of abstractsubrepo.__init__ (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24645
diff changeset
   437
        ``ctx`` is the context referring this subrepository in the
98ab035e9332 subrepo: change arguments of abstractsubrepo.__init__ (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24645
diff changeset
   438
        parent repository.
98ab035e9332 subrepo: change arguments of abstractsubrepo.__init__ (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24645
diff changeset
   439
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26587
diff changeset
   440
        ``path`` is the path to this subrepository as seen from
24671
98ab035e9332 subrepo: change arguments of abstractsubrepo.__init__ (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24645
diff changeset
   441
        innermost repository.
98ab035e9332 subrepo: change arguments of abstractsubrepo.__init__ (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24645
diff changeset
   442
        """
98ab035e9332 subrepo: change arguments of abstractsubrepo.__init__ (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24645
diff changeset
   443
        self.ui = ctx.repo().ui
98ab035e9332 subrepo: change arguments of abstractsubrepo.__init__ (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24645
diff changeset
   444
        self._ctx = ctx
98ab035e9332 subrepo: change arguments of abstractsubrepo.__init__ (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24645
diff changeset
   445
        self._path = path
23536
fcbc66b5da6a subrepo: store the ui object in the base class
Matt Harbison <matt_harbison@yahoo.com>
parents: 23523
diff changeset
   446
18937
9a171baa9202 subrepo: introduce storeclean method
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18936
diff changeset
   447
    def storeclean(self, path):
9a171baa9202 subrepo: introduce storeclean method
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18936
diff changeset
   448
        """
9a171baa9202 subrepo: introduce storeclean method
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18936
diff changeset
   449
        returns true if the repository has not changed since it was last
9a171baa9202 subrepo: introduce storeclean method
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18936
diff changeset
   450
        cloned from or pushed to a given repository.
9a171baa9202 subrepo: introduce storeclean method
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18936
diff changeset
   451
        """
9a171baa9202 subrepo: introduce storeclean method
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18936
diff changeset
   452
        return False
9a171baa9202 subrepo: introduce storeclean method
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18936
diff changeset
   453
13174
be7e8e9bc5e5 mq: update .hgsubstate if subrepos are clean (issue2499)
Kevin Bullock <kbullock@ringworld.org>
parents: 13172
diff changeset
   454
    def dirty(self, ignoreupdate=False):
be7e8e9bc5e5 mq: update .hgsubstate if subrepos are clean (issue2499)
Kevin Bullock <kbullock@ringworld.org>
parents: 13172
diff changeset
   455
        """returns true if the dirstate of the subrepo is dirty or does not
be7e8e9bc5e5 mq: update .hgsubstate if subrepos are clean (issue2499)
Kevin Bullock <kbullock@ringworld.org>
parents: 13172
diff changeset
   456
        match current stored state. If ignoreupdate is true, only check
be7e8e9bc5e5 mq: update .hgsubstate if subrepos are clean (issue2499)
Kevin Bullock <kbullock@ringworld.org>
parents: 13172
diff changeset
   457
        whether the subrepo has uncommitted changes in its dirstate.
11559
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   458
        """
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   459
        raise NotImplementedError
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   460
24470
76b0b0fed2e3 subrepo: add dirtyreason to centralize composing dirty reason message
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24413
diff changeset
   461
    def dirtyreason(self, ignoreupdate=False):
76b0b0fed2e3 subrepo: add dirtyreason to centralize composing dirty reason message
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24413
diff changeset
   462
        """return reason string if it is ``dirty()``
76b0b0fed2e3 subrepo: add dirtyreason to centralize composing dirty reason message
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24413
diff changeset
   463
76b0b0fed2e3 subrepo: add dirtyreason to centralize composing dirty reason message
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24413
diff changeset
   464
        Returned string should have enough information for the message
76b0b0fed2e3 subrepo: add dirtyreason to centralize composing dirty reason message
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24413
diff changeset
   465
        of exception.
76b0b0fed2e3 subrepo: add dirtyreason to centralize composing dirty reason message
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24413
diff changeset
   466
76b0b0fed2e3 subrepo: add dirtyreason to centralize composing dirty reason message
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24413
diff changeset
   467
        This returns None, otherwise.
76b0b0fed2e3 subrepo: add dirtyreason to centralize composing dirty reason message
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24413
diff changeset
   468
        """
76b0b0fed2e3 subrepo: add dirtyreason to centralize composing dirty reason message
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24413
diff changeset
   469
        if self.dirty(ignoreupdate=ignoreupdate):
76b0b0fed2e3 subrepo: add dirtyreason to centralize composing dirty reason message
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24413
diff changeset
   470
            return _("uncommitted changes in subrepository '%s'"
76b0b0fed2e3 subrepo: add dirtyreason to centralize composing dirty reason message
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24413
diff changeset
   471
                     ) % subrelpath(self)
76b0b0fed2e3 subrepo: add dirtyreason to centralize composing dirty reason message
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24413
diff changeset
   472
30755
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30639
diff changeset
   473
    def bailifchanged(self, ignoreupdate=False, hint=None):
24471
1ff35d76421c subrepo: add bailifchanged to centralize raising Abort if subrepo is dirty
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24470
diff changeset
   474
        """raise Abort if subrepository is ``dirty()``
1ff35d76421c subrepo: add bailifchanged to centralize raising Abort if subrepo is dirty
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24470
diff changeset
   475
        """
1ff35d76421c subrepo: add bailifchanged to centralize raising Abort if subrepo is dirty
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24470
diff changeset
   476
        dirtyreason = self.dirtyreason(ignoreupdate=ignoreupdate)
1ff35d76421c subrepo: add bailifchanged to centralize raising Abort if subrepo is dirty
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24470
diff changeset
   477
        if dirtyreason:
30755
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30639
diff changeset
   478
            raise error.Abort(dirtyreason, hint=hint)
24471
1ff35d76421c subrepo: add bailifchanged to centralize raising Abort if subrepo is dirty
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24470
diff changeset
   479
16072
bcb973abcc0b subrepo: add basestate method
Matt Mackall <mpm@selenic.com>
parents: 16022
diff changeset
   480
    def basestate(self):
bcb973abcc0b subrepo: add basestate method
Matt Mackall <mpm@selenic.com>
parents: 16022
diff changeset
   481
        """current working directory base state, disregarding .hgsubstate
bcb973abcc0b subrepo: add basestate method
Matt Mackall <mpm@selenic.com>
parents: 16022
diff changeset
   482
        state and working directory modifications"""
bcb973abcc0b subrepo: add basestate method
Matt Mackall <mpm@selenic.com>
parents: 16022
diff changeset
   483
        raise NotImplementedError
bcb973abcc0b subrepo: add basestate method
Matt Mackall <mpm@selenic.com>
parents: 16022
diff changeset
   484
12506
e7d45e41338c subrepos: add missing self argument to abstractsubrepo.checknested
Brodie Rao <brodie@bitheap.org>
parents: 12503
diff changeset
   485
    def checknested(self, path):
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12060
diff changeset
   486
        """check if path is a subrepository within this repository"""
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12060
diff changeset
   487
        return False
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12060
diff changeset
   488
11559
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   489
    def commit(self, text, user, date):
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   490
        """commit the current changes to the subrepo with the given
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   491
        log message. Use given user and date if possible. Return the
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   492
        new state of the subrepo.
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   493
        """
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   494
        raise NotImplementedError
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   495
20176
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   496
    def phase(self, state):
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   497
        """returns phase of specified state in the subrepository.
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   498
        """
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   499
        return phases.public
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   500
11559
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   501
    def remove(self):
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   502
        """remove the subrepo
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   503
11559
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   504
        (should verify the dirstate is not dirty first)
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   505
        """
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   506
        raise NotImplementedError
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   507
13322
c19b9282d3a7 subrepo: make update -C clean the working directory for svn subrepos
Erik Zielke <ez@aragost.com>
parents: 13287
diff changeset
   508
    def get(self, state, overwrite=False):
11559
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   509
        """run whatever commands are needed to put the subrepo into
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   510
        this state
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   511
        """
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   512
        raise NotImplementedError
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   513
13413
fa921dcd9993 subrepo: remove argument introduced by mistake in c19b9282d3a7
Erik Zielke <ez@aragost.com>
parents: 13333
diff changeset
   514
    def merge(self, state):
11559
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   515
        """merge currently-saved state with the new state."""
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   516
        raise NotImplementedError
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   517
15708
309e49491253 push: propagate --new-branch and --ssh options when pushing subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 15614
diff changeset
   518
    def push(self, opts):
11572
324bad1dc230 Merge with stable
Martin Geisler <mg@lazybytes.net>
parents: 11560 11571
diff changeset
   519
        """perform whatever action is analogous to 'hg push'
11559
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   520
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   521
        This may be a no-op on some systems.
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   522
        """
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   523
        raise NotImplementedError
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   524
23963
8f02682ff3b0 subrepo: don't abort in add when non-hg subrepos are present (issue4513)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23938
diff changeset
   525
    def add(self, ui, match, prefix, explicitonly, **opts):
12270
166b9866580a add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12210
diff changeset
   526
        return []
11559
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   527
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23536
diff changeset
   528
    def addremove(self, matcher, prefix, opts, dry_run, similarity):
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
   529
        self.ui.warn("%s: %s" % (prefix, _("addremove is not supported")))
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23536
diff changeset
   530
        return 1
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23536
diff changeset
   531
23576
70a7478c33de subrepo: drop the 'ui' parameter to cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23575
diff changeset
   532
    def cat(self, match, prefix, **opts):
21041
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 20970
diff changeset
   533
        return 1
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 20970
diff changeset
   534
12166
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
   535
    def status(self, rev2, **opts):
22914
c95db3208a33 status: update various other methods to return new class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22695
diff changeset
   536
        return scmutil.status([], [], [], [], [], [], [])
12166
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
   537
18006
0c10cf819146 subrepo: add argument to "diff()" to pass "ui" of caller side (issue3712) (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17895
diff changeset
   538
    def diff(self, ui, diffopts, node2, match, prefix, **opts):
12167
d2c5b0927c28 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
   539
        pass
d2c5b0927c28 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
   540
12272
42ecd56399d7 outgoing: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12270
diff changeset
   541
    def outgoing(self, ui, dest, opts):
42ecd56399d7 outgoing: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12270
diff changeset
   542
        return 1
42ecd56399d7 outgoing: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12270
diff changeset
   543
12274
c02e1ed3d407 incoming: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12272
diff changeset
   544
    def incoming(self, ui, source, opts):
c02e1ed3d407 incoming: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12272
diff changeset
   545
        return 1
c02e1ed3d407 incoming: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12272
diff changeset
   546
12322
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   547
    def files(self):
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   548
        """return filename iterator"""
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   549
        raise NotImplementedError
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   550
31099
b44ab288358e subrepo: run the repo decoders when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 30755
diff changeset
   551
    def filedata(self, name, decode):
b44ab288358e subrepo: run the repo decoders when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 30755
diff changeset
   552
        """return file data, optionally passed through repo decoders"""
12322
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   553
        raise NotImplementedError
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   554
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   555
    def fileflags(self, name):
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   556
        """return file flags"""
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   557
        return ''
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   558
25121
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
   559
    def getfileset(self, expr):
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
   560
        """Resolve the fileset expression for this repo"""
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
   561
        return set()
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
   562
25228
63a57a2727b6 files: recurse into subrepos automatically with an explicit path
Matt Harbison <matt_harbison@yahoo.com>
parents: 25172
diff changeset
   563
    def printfiles(self, ui, m, fm, fmt, subrepos):
24413
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24409
diff changeset
   564
        """handle the files command for this subrepo"""
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24409
diff changeset
   565
        return 1
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24409
diff changeset
   566
31099
b44ab288358e subrepo: run the repo decoders when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 30755
diff changeset
   567
    def archive(self, archiver, prefix, match=None, decode=True):
17108
1894dac619de subrepo: propagate matcher to subrepos when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 17036
diff changeset
   568
        if match is not None:
1894dac619de subrepo: propagate matcher to subrepos when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 17036
diff changeset
   569
            files = [f for f in self.files() if match(f)]
1894dac619de subrepo: propagate matcher to subrepos when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 17036
diff changeset
   570
        else:
1894dac619de subrepo: propagate matcher to subrepos when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 17036
diff changeset
   571
            files = self.files()
13144
aae2d5cbde64 subrepo: add progress bar support to archive
Martin Geisler <mg@aragost.com>
parents: 13137
diff changeset
   572
        total = len(files)
aae2d5cbde64 subrepo: add progress bar support to archive
Martin Geisler <mg@aragost.com>
parents: 13137
diff changeset
   573
        relpath = subrelpath(self)
23575
a2f139d25845 subrepo: drop the 'ui' parameter to archive()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23574
diff changeset
   574
        self.ui.progress(_('archiving (%s)') % relpath, 0,
a2f139d25845 subrepo: drop the 'ui' parameter to archive()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23574
diff changeset
   575
                         unit=_('files'), total=total)
13144
aae2d5cbde64 subrepo: add progress bar support to archive
Martin Geisler <mg@aragost.com>
parents: 13137
diff changeset
   576
        for i, name in enumerate(files):
12323
f00953d9533c subrepo: add support for 'hg archive'
Martin Geisler <mg@aragost.com>
parents: 12322
diff changeset
   577
            flags = self.fileflags(name)
25658
e93036747902 global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25601
diff changeset
   578
            mode = 'x' in flags and 0o755 or 0o644
12323
f00953d9533c subrepo: add support for 'hg archive'
Martin Geisler <mg@aragost.com>
parents: 12322
diff changeset
   579
            symlink = 'l' in flags
24924
41cd8171e58f archive: always use portable path component separators with subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 24877
diff changeset
   580
            archiver.addfile(prefix + self._path + '/' + name,
31099
b44ab288358e subrepo: run the repo decoders when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 30755
diff changeset
   581
                             mode, symlink, self.filedata(name, decode))
23575
a2f139d25845 subrepo: drop the 'ui' parameter to archive()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23574
diff changeset
   582
            self.ui.progress(_('archiving (%s)') % relpath, i + 1,
a2f139d25845 subrepo: drop the 'ui' parameter to archive()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23574
diff changeset
   583
                             unit=_('files'), total=total)
a2f139d25845 subrepo: drop the 'ui' parameter to archive()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23574
diff changeset
   584
        self.ui.progress(_('archiving (%s)') % relpath, None)
18967
88d1b59f6906 archive: raise error.Abort if the file pattern matches no files
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18964
diff changeset
   585
        return total
12323
f00953d9533c subrepo: add support for 'hg archive'
Martin Geisler <mg@aragost.com>
parents: 12322
diff changeset
   586
15410
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15287
diff changeset
   587
    def walk(self, match):
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15287
diff changeset
   588
        '''
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15287
diff changeset
   589
        walk recursively through the directory tree, finding all files
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15287
diff changeset
   590
        matched by the match function
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15287
diff changeset
   591
        '''
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15287
diff changeset
   592
        pass
12323
f00953d9533c subrepo: add support for 'hg archive'
Martin Geisler <mg@aragost.com>
parents: 12322
diff changeset
   593
23577
597b071a0e0d subrepo: drop the 'ui' parameter to forget()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23576
diff changeset
   594
    def forget(self, match, prefix):
16527
17a1f7690b49 subrepo: fix default implementation of forget() (issue3404)
Patrick Mezard <patrick@mezard.eu>
parents: 16468
diff changeset
   595
        return ([], [])
12323
f00953d9533c subrepo: add support for 'hg archive'
Martin Geisler <mg@aragost.com>
parents: 12322
diff changeset
   596
28607
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28017
diff changeset
   597
    def removefiles(self, matcher, prefix, after, force, subrepos, warnings):
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 22927
diff changeset
   598
        """remove the matched files from the subrepository and the filesystem,
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 22927
diff changeset
   599
        possibly by force and/or after the file has been removed from the
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 22927
diff changeset
   600
        filesystem.  Return 0 on success, 1 on any warning.
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 22927
diff changeset
   601
        """
28607
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28017
diff changeset
   602
        warnings.append(_("warning: removefiles not implemented (%s)")
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28017
diff changeset
   603
                        % self._path)
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 22927
diff changeset
   604
        return 1
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 22927
diff changeset
   605
23579
e1c39f207719 subrepo: drop the 'ui' parameter to revert()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23578
diff changeset
   606
    def revert(self, substate, *pats, **opts):
29243
28dc0030228a subrepo: make a message translatable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29021
diff changeset
   607
        self.ui.warn(_('%s: reverting %s subrepos is unsupported\n') \
16468
2fb521d75dc2 revert: show warning when reverting subrepos that do not support revert
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16451
diff changeset
   608
            % (substate[0], substate[2]))
16429
71dcce391a44 revert: add support for reverting subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16197
diff changeset
   609
        return []
71dcce391a44 revert: add support for reverting subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16197
diff changeset
   610
21400
78a60daacea8 subrepo: add shortid() method to subrepo classes
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21041
diff changeset
   611
    def shortid(self, revid):
78a60daacea8 subrepo: add shortid() method to subrepo classes
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21041
diff changeset
   612
        return revid
78a60daacea8 subrepo: add shortid() method to subrepo classes
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21041
diff changeset
   613
25591
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
   614
    def verify(self):
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
   615
        '''verify the integrity of the repository.  Return 0 on success or
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
   616
        warning, 1 on any error.
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
   617
        '''
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
   618
        return 0
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
   619
24672
dd0b86f740ef subrepo: add wvfs field to access the working directory via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24671
diff changeset
   620
    @propertycache
dd0b86f740ef subrepo: add wvfs field to access the working directory via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24671
diff changeset
   621
    def wvfs(self):
dd0b86f740ef subrepo: add wvfs field to access the working directory via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24671
diff changeset
   622
        """return vfs to access the working directory of this subrepository
dd0b86f740ef subrepo: add wvfs field to access the working directory via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24671
diff changeset
   623
        """
31236
8a0687a2be75 vfs: use 'vfs' module directly in 'mercurial.subrepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31102
diff changeset
   624
        return vfsmod.vfs(self._ctx.repo().wvfs.join(self._path))
24672
dd0b86f740ef subrepo: add wvfs field to access the working directory via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24671
diff changeset
   625
24673
105758d1b37b subrepo: add _relpath field to centralize subrelpath logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24672
diff changeset
   626
    @propertycache
105758d1b37b subrepo: add _relpath field to centralize subrelpath logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24672
diff changeset
   627
    def _relpath(self):
105758d1b37b subrepo: add _relpath field to centralize subrelpath logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24672
diff changeset
   628
        """return path to this subrepository as seen from outermost repository
105758d1b37b subrepo: add _relpath field to centralize subrelpath logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24672
diff changeset
   629
        """
24785
39f519be5e65 subrepo: backout 93b0e0db7929 to restore reporelpath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24778
diff changeset
   630
        return self.wvfs.reljoin(reporelpath(self._ctx.repo()), self._path)
24673
105758d1b37b subrepo: add _relpath field to centralize subrelpath logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24672
diff changeset
   631
11559
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
   632
class hgsubrepo(abstractsubrepo):
29021
92d37fb3f1aa verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28949
diff changeset
   633
    def __init__(self, ctx, path, state, allowcreate):
24671
98ab035e9332 subrepo: change arguments of abstractsubrepo.__init__ (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24645
diff changeset
   634
        super(hgsubrepo, self).__init__(ctx, path)
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   635
        self._state = state
24302
6e092ea2eff1 subrepo: replace 'ctx._repo' with 'ctx.repo()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24256
diff changeset
   636
        r = ctx.repo()
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   637
        root = r.wjoin(path)
29021
92d37fb3f1aa verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28949
diff changeset
   638
        create = allowcreate and not r.wvfs.exists('%s/.hg' % path)
17873
573bec4ab7ba subrepo: isolate configuration between each repositories in subrepo tree
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17707
diff changeset
   639
        self._repo = hg.repository(r.baseui, root, create=create)
24877
cc497780eaf9 subrepo: propagate the --hidden option to hg subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 24876
diff changeset
   640
cc497780eaf9 subrepo: propagate the --hidden option to hg subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 24876
diff changeset
   641
        # Propagate the parent's --hidden option
cc497780eaf9 subrepo: propagate the --hidden option to hg subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 24876
diff changeset
   642
        if r is r.unfiltered():
cc497780eaf9 subrepo: propagate the --hidden option to hg subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 24876
diff changeset
   643
            self._repo = self._repo.unfiltered()
cc497780eaf9 subrepo: propagate the --hidden option to hg subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 24876
diff changeset
   644
23573
3fec2a3c768b subrepo: reset 'self.ui' to the subrepo copy of 'ui' in the hgsubrepo class
Matt Harbison <matt_harbison@yahoo.com>
parents: 23572
diff changeset
   645
        self.ui = self._repo.ui
17873
573bec4ab7ba subrepo: isolate configuration between each repositories in subrepo tree
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17707
diff changeset
   646
        for s, k in [('ui', 'commitsubrepos')]:
573bec4ab7ba subrepo: isolate configuration between each repositories in subrepo tree
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17707
diff changeset
   647
            v = r.ui.config(s, k)
573bec4ab7ba subrepo: isolate configuration between each repositories in subrepo tree
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17707
diff changeset
   648
            if v:
23574
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   649
                self.ui.setconfig(s, k, v, 'subrepo')
25848
0ae07173881d subrepo: mark internal-only option
Matt Mackall <mpm@selenic.com>
parents: 25773
diff changeset
   650
        # internal config: ui._usedassubrepo
23574
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   651
        self.ui.setconfig('ui', '_usedassubrepo', 'True', 'subrepo')
14281
ccb7240acf32 subrepo: create subrepos using clone instead of pull
Martin Geisler <mg@aragost.com>
parents: 14221
diff changeset
   652
        self._initrepo(r, state[0], create)
ccb7240acf32 subrepo: create subrepos using clone instead of pull
Martin Geisler <mg@aragost.com>
parents: 14221
diff changeset
   653
18939
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   654
    def storeclean(self, path):
27844
469b86c49503 with: use context manager in subrepo storeclean
Bryan O'Sullivan <bryano@fb.com>
parents: 27843
diff changeset
   655
        with self._repo.lock():
21885
fe9db58b0b2d subrepo: ensure "lock.release()" execution at the end of "storeclean()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21585
diff changeset
   656
            return self._storeclean(path)
fe9db58b0b2d subrepo: ensure "lock.release()" execution at the end of "storeclean()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21585
diff changeset
   657
fe9db58b0b2d subrepo: ensure "lock.release()" execution at the end of "storeclean()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21585
diff changeset
   658
    def _storeclean(self, path):
18939
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   659
        clean = True
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   660
        itercache = self._calcstorehash(path)
25172
ca9c02cb81be subrepo: further replacement of try/except with 'next'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25121
diff changeset
   661
        for filehash in self._readstorehashcache(path):
ca9c02cb81be subrepo: further replacement of try/except with 'next'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25121
diff changeset
   662
            if filehash != next(itercache, None):
ca9c02cb81be subrepo: further replacement of try/except with 'next'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25121
diff changeset
   663
                clean = False
ca9c02cb81be subrepo: further replacement of try/except with 'next'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25121
diff changeset
   664
                break
ca9c02cb81be subrepo: further replacement of try/except with 'next'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25121
diff changeset
   665
        if clean:
ca9c02cb81be subrepo: further replacement of try/except with 'next'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25121
diff changeset
   666
            # if not empty:
18939
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   667
            # the cached and current pull states have a different size
25172
ca9c02cb81be subrepo: further replacement of try/except with 'next'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25121
diff changeset
   668
            clean = next(itercache, None) is None
18939
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   669
        return clean
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   670
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   671
    def _calcstorehash(self, remotepath):
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   672
        '''calculate a unique "store hash"
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   673
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   674
        This method is used to to detect when there are changes that may
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   675
        require a push to a given remote path.'''
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   676
        # sort the files that will be hashed in increasing (likely) file size
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   677
        filelist = ('bookmarks', 'store/phaseroots', 'store/00changelog.i')
18940
798bdb7f1517 subrepo: do not push mercurial subrepos whose store is clean
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18939
diff changeset
   678
        yield '# %s\n' % _expandedabspath(remotepath)
23365
2ff394bbfa74 subrepo: replace "_calcfilehash" invocation by "vfs.tryread"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23364
diff changeset
   679
        vfs = self._repo.vfs
18939
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   680
        for relname in filelist:
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29243
diff changeset
   681
            filehash = hashlib.sha1(vfs.tryread(relname)).hexdigest()
23365
2ff394bbfa74 subrepo: replace "_calcfilehash" invocation by "vfs.tryread"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23364
diff changeset
   682
            yield '%s = %s\n' % (relname, filehash)
18939
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   683
23367
115af8de76a4 subrepo: add "_cachestorehashvfs" to handle cache store hash files via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23366
diff changeset
   684
    @propertycache
115af8de76a4 subrepo: add "_cachestorehashvfs" to handle cache store hash files via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23366
diff changeset
   685
    def _cachestorehashvfs(self):
31325
b589f5b953f4 subrepo: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31236
diff changeset
   686
        return vfsmod.vfs(self._repo.vfs.join('cache/storehash'))
23367
115af8de76a4 subrepo: add "_cachestorehashvfs" to handle cache store hash files via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23366
diff changeset
   687
18939
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   688
    def _readstorehashcache(self, remotepath):
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   689
        '''read the store hash cache for a given remote repository'''
23369
22e00674d17e subrepo: replace direct file APIs around "readlines" by "vfs.tryreadlines"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23367
diff changeset
   690
        cachefile = _getstorehashcachename(remotepath)
22e00674d17e subrepo: replace direct file APIs around "readlines" by "vfs.tryreadlines"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23367
diff changeset
   691
        return self._cachestorehashvfs.tryreadlines(cachefile, 'r')
18939
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   692
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   693
    def _cachestorehash(self, remotepath):
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   694
        '''cache the current store hash
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   695
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   696
        Each remote repo requires its own store hash cache, because a subrepo
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   697
        store may be "clean" versus a given remote repo, but not versus another
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   698
        '''
23372
6cfa7a73b6e7 subrepo: replace direct file APIs around "writelines" by "vfs.writelines"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23369
diff changeset
   699
        cachefile = _getstorehashcachename(remotepath)
27843
b2efdb66c406 with: use context manager in subrepo _cachestorehash
Bryan O'Sullivan <bryano@fb.com>
parents: 27651
diff changeset
   700
        with self._repo.lock():
21886
b9e8fdc35daf subrepo: ensure "lock.release()" execution at the end of "_cachestorehash()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21885
diff changeset
   701
            storehash = list(self._calcstorehash(remotepath))
23372
6cfa7a73b6e7 subrepo: replace direct file APIs around "writelines" by "vfs.writelines"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23369
diff changeset
   702
            vfs = self._cachestorehashvfs
6cfa7a73b6e7 subrepo: replace direct file APIs around "writelines" by "vfs.writelines"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23369
diff changeset
   703
            vfs.writelines(cachefile, storehash, mode='w', notindexed=True)
18939
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   704
25572
3d8c044ed513 subrepo: introduce hgsubrepo._getctx()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25416
diff changeset
   705
    def _getctx(self):
3d8c044ed513 subrepo: introduce hgsubrepo._getctx()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25416
diff changeset
   706
        '''fetch the context for this subrepo revision, possibly a workingctx
3d8c044ed513 subrepo: introduce hgsubrepo._getctx()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25416
diff changeset
   707
        '''
3d8c044ed513 subrepo: introduce hgsubrepo._getctx()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25416
diff changeset
   708
        if self._ctx.rev() is None:
3d8c044ed513 subrepo: introduce hgsubrepo._getctx()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25416
diff changeset
   709
            return self._repo[None]  # workingctx if parent is workingctx
3d8c044ed513 subrepo: introduce hgsubrepo._getctx()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25416
diff changeset
   710
        else:
3d8c044ed513 subrepo: introduce hgsubrepo._getctx()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25416
diff changeset
   711
            rev = self._state[1]
3d8c044ed513 subrepo: introduce hgsubrepo._getctx()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25416
diff changeset
   712
            return self._repo[rev]
3d8c044ed513 subrepo: introduce hgsubrepo._getctx()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25416
diff changeset
   713
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
   714
    @annotatesubrepoerror
14281
ccb7240acf32 subrepo: create subrepos using clone instead of pull
Martin Geisler <mg@aragost.com>
parents: 14221
diff changeset
   715
    def _initrepo(self, parentrepo, source, create):
ccb7240acf32 subrepo: create subrepos using clone instead of pull
Martin Geisler <mg@aragost.com>
parents: 14221
diff changeset
   716
        self._repo._subparent = parentrepo
ccb7240acf32 subrepo: create subrepos using clone instead of pull
Martin Geisler <mg@aragost.com>
parents: 14221
diff changeset
   717
        self._repo._subsource = source
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   718
10666
4c50a90b90fc subrepo: keep ui and hgrc in sync when creating new repo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10665
diff changeset
   719
        if create:
21891
db8a27d92818 subrepo: ensure "close()" execution at the end of "_initrepo()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21889
diff changeset
   720
            lines = ['[paths]\n']
10666
4c50a90b90fc subrepo: keep ui and hgrc in sync when creating new repo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10665
diff changeset
   721
4c50a90b90fc subrepo: keep ui and hgrc in sync when creating new repo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10665
diff changeset
   722
            def addpathconfig(key, value):
12753
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   723
                if value:
21891
db8a27d92818 subrepo: ensure "close()" execution at the end of "_initrepo()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21889
diff changeset
   724
                    lines.append('%s = %s\n' % (key, value))
23574
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   725
                    self.ui.setconfig('paths', key, value, 'subrepo')
10666
4c50a90b90fc subrepo: keep ui and hgrc in sync when creating new repo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10665
diff changeset
   726
12753
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   727
            defpath = _abssource(self._repo, abort=False)
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   728
            defpushpath = _abssource(self._repo, True, abort=False)
10666
4c50a90b90fc subrepo: keep ui and hgrc in sync when creating new repo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10665
diff changeset
   729
            addpathconfig('default', defpath)
10697
c90d923fff64 subrepo: fix hgrc paths section during subrepo pulling
Edouard Gomez <ed.gomez@free.fr>
parents: 10666
diff changeset
   730
            if defpath != defpushpath:
c90d923fff64 subrepo: fix hgrc paths section during subrepo pulling
Edouard Gomez <ed.gomez@free.fr>
parents: 10666
diff changeset
   731
                addpathconfig('default-push', defpushpath)
21891
db8a27d92818 subrepo: ensure "close()" execution at the end of "_initrepo()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21889
diff changeset
   732
23877
7cc77030c557 localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23679
diff changeset
   733
            fp = self._repo.vfs("hgrc", "w", text=True)
21891
db8a27d92818 subrepo: ensure "close()" execution at the end of "_initrepo()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21889
diff changeset
   734
            try:
db8a27d92818 subrepo: ensure "close()" execution at the end of "_initrepo()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21889
diff changeset
   735
                fp.write(''.join(lines))
db8a27d92818 subrepo: ensure "close()" execution at the end of "_initrepo()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21889
diff changeset
   736
            finally:
db8a27d92818 subrepo: ensure "close()" execution at the end of "_initrepo()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21889
diff changeset
   737
                fp.close()
10666
4c50a90b90fc subrepo: keep ui and hgrc in sync when creating new repo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10665
diff changeset
   738
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
   739
    @annotatesubrepoerror
23885
9994f45ba714 add: pass options via keyword args
Matt Harbison <matt_harbison@yahoo.com>
parents: 23877
diff changeset
   740
    def add(self, ui, match, prefix, explicitonly, **opts):
9994f45ba714 add: pass options via keyword args
Matt Harbison <matt_harbison@yahoo.com>
parents: 23877
diff changeset
   741
        return cmdutil.add(ui, self._repo, match,
24675
47e7d5fbbf04 subrepo: use vfs.reljoin instead of os.path.join
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24674
diff changeset
   742
                           self.wvfs.reljoin(prefix, self._path),
47e7d5fbbf04 subrepo: use vfs.reljoin instead of os.path.join
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24674
diff changeset
   743
                           explicitonly, **opts)
12270
166b9866580a add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12210
diff changeset
   744
24132
b5898bf7119a subrepo: annotate addremove with @annotatesubrepoerror
Matt Harbison <matt_harbison@yahoo.com>
parents: 23991
diff changeset
   745
    @annotatesubrepoerror
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23536
diff changeset
   746
    def addremove(self, m, prefix, opts, dry_run, similarity):
23540
f274d27f1994 addremove: automatically process a subrepository's subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 23537
diff changeset
   747
        # In the same way as sub directories are processed, once in a subrepo,
f274d27f1994 addremove: automatically process a subrepository's subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 23537
diff changeset
   748
        # always entry any of its subrepos.  Don't corrupt the options that will
f274d27f1994 addremove: automatically process a subrepository's subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 23537
diff changeset
   749
        # be used to process sibling subrepos however.
f274d27f1994 addremove: automatically process a subrepository's subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 23537
diff changeset
   750
        opts = copy.copy(opts)
f274d27f1994 addremove: automatically process a subrepository's subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 23537
diff changeset
   751
        opts['subrepos'] = True
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23536
diff changeset
   752
        return scmutil.addremove(self._repo, m,
24675
47e7d5fbbf04 subrepo: use vfs.reljoin instead of os.path.join
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24674
diff changeset
   753
                                 self.wvfs.reljoin(prefix, self._path), opts,
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23536
diff changeset
   754
                                 dry_run, similarity)
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23536
diff changeset
   755
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
   756
    @annotatesubrepoerror
23576
70a7478c33de subrepo: drop the 'ui' parameter to cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23575
diff changeset
   757
    def cat(self, match, prefix, **opts):
21041
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 20970
diff changeset
   758
        rev = self._state[1]
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 20970
diff changeset
   759
        ctx = self._repo[rev]
23576
70a7478c33de subrepo: drop the 'ui' parameter to cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23575
diff changeset
   760
        return cmdutil.cat(self.ui, self._repo, ctx, match, prefix, **opts)
21041
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 20970
diff changeset
   761
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 20970
diff changeset
   762
    @annotatesubrepoerror
12166
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
   763
    def status(self, rev2, **opts):
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
   764
        try:
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
   765
            rev1 = self._state[1]
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
   766
            ctx1 = self._repo[rev1]
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
   767
            ctx2 = self._repo[rev2]
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
   768
            return self._repo.status(ctx1, ctx2, **opts)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
   769
        except error.RepoLookupError as inst:
23574
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   770
            self.ui.warn(_('warning: error "%s" in subrepository "%s"\n')
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   771
                         % (inst, subrelpath(self)))
22914
c95db3208a33 status: update various other methods to return new class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22695
diff changeset
   772
            return scmutil.status([], [], [], [], [], [], [])
12166
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
   773
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
   774
    @annotatesubrepoerror
18006
0c10cf819146 subrepo: add argument to "diff()" to pass "ui" of caller side (issue3712) (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17895
diff changeset
   775
    def diff(self, ui, diffopts, node2, match, prefix, **opts):
12167
d2c5b0927c28 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
   776
        try:
d2c5b0927c28 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
   777
            node1 = node.bin(self._state[1])
12209
affec9fb56ef subrepos: handle diff nodeids in subrepos, not before
Patrick Mezard <pmezard@gmail.com>
parents: 12176
diff changeset
   778
            # We currently expect node2 to come from substate and be
affec9fb56ef subrepos: handle diff nodeids in subrepos, not before
Patrick Mezard <pmezard@gmail.com>
parents: 12176
diff changeset
   779
            # in hex format
12210
21eb85e9ea94 subrepo: handle diff with working copy
Martin Geisler <mg@lazybytes.net>
parents: 12209
diff changeset
   780
            if node2 is not None:
21eb85e9ea94 subrepo: handle diff with working copy
Martin Geisler <mg@lazybytes.net>
parents: 12209
diff changeset
   781
                node2 = node.bin(node2)
18006
0c10cf819146 subrepo: add argument to "diff()" to pass "ui" of caller side (issue3712) (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17895
diff changeset
   782
            cmdutil.diffordiffstat(ui, self._repo, diffopts,
12167
d2c5b0927c28 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
   783
                                   node1, node2, match,
17968
a9f4a6076740 subrepo: use posixpath when diffing, for consistent paths
Bryan O'Sullivan <bryano@fb.com>
parents: 17895
diff changeset
   784
                                   prefix=posixpath.join(prefix, self._path),
12167
d2c5b0927c28 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
   785
                                   listsubrepos=True, **opts)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
   786
        except error.RepoLookupError as inst:
23574
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   787
            self.ui.warn(_('warning: error "%s" in subrepository "%s"\n')
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   788
                          % (inst, subrelpath(self)))
12167
d2c5b0927c28 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
   789
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
   790
    @annotatesubrepoerror
31099
b44ab288358e subrepo: run the repo decoders when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 30755
diff changeset
   791
    def archive(self, archiver, prefix, match=None, decode=True):
15286
4be845e3932c subrepo: pull revisions on demand when archiving hg subrepos
Martin Geisler <mg@aragost.com>
parents: 15234
diff changeset
   792
        self._get(self._state + ('hg',))
23575
a2f139d25845 subrepo: drop the 'ui' parameter to archive()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23574
diff changeset
   793
        total = abstractsubrepo.archive(self, archiver, prefix, match)
12323
f00953d9533c subrepo: add support for 'hg archive'
Martin Geisler <mg@aragost.com>
parents: 12322
diff changeset
   794
        rev = self._state[1]
f00953d9533c subrepo: add support for 'hg archive'
Martin Geisler <mg@aragost.com>
parents: 12322
diff changeset
   795
        ctx = self._repo[rev]
f00953d9533c subrepo: add support for 'hg archive'
Martin Geisler <mg@aragost.com>
parents: 12322
diff changeset
   796
        for subpath in ctx.substate:
25601
3ec8351fa6ed archive: support 'wdir()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 25600
diff changeset
   797
            s = subrepo(ctx, subpath, True)
28017
d3f1b7ee5e70 match: rename "narrowmatcher" to "subdirmatcher" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27935
diff changeset
   798
            submatch = matchmod.subdirmatcher(subpath, match)
31099
b44ab288358e subrepo: run the repo decoders when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 30755
diff changeset
   799
            total += s.archive(archiver, prefix + self._path + '/', submatch,
b44ab288358e subrepo: run the repo decoders when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 30755
diff changeset
   800
                               decode)
18967
88d1b59f6906 archive: raise error.Abort if the file pattern matches no files
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18964
diff changeset
   801
        return total
12323
f00953d9533c subrepo: add support for 'hg archive'
Martin Geisler <mg@aragost.com>
parents: 12322
diff changeset
   802
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
   803
    @annotatesubrepoerror
13174
be7e8e9bc5e5 mq: update .hgsubstate if subrepos are clean (issue2499)
Kevin Bullock <kbullock@ringworld.org>
parents: 13172
diff changeset
   804
    def dirty(self, ignoreupdate=False):
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   805
        r = self._state[1]
13174
be7e8e9bc5e5 mq: update .hgsubstate if subrepos are clean (issue2499)
Kevin Bullock <kbullock@ringworld.org>
parents: 13172
diff changeset
   806
        if r == '' and not ignoreupdate: # no state recorded
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   807
            return True
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   808
        w = self._repo[None]
14316
d5b525697ddb extensions: drop maxlength from enabled and disabled
Matt Mackall <mpm@selenic.com>
parents: 14312
diff changeset
   809
        if r != w.p1().hex() and not ignoreupdate:
13325
7ebdfa37842e subrepo: clarify comments in dirty() methods
Kevin Bullock <kbullock@ringworld.org>
parents: 13324
diff changeset
   810
            # different version checked out
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   811
            return True
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   812
        return w.dirty() # working directory changed
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   813
16072
bcb973abcc0b subrepo: add basestate method
Matt Mackall <mpm@selenic.com>
parents: 16022
diff changeset
   814
    def basestate(self):
bcb973abcc0b subrepo: add basestate method
Matt Mackall <mpm@selenic.com>
parents: 16022
diff changeset
   815
        return self._repo['.'].hex()
bcb973abcc0b subrepo: add basestate method
Matt Mackall <mpm@selenic.com>
parents: 16022
diff changeset
   816
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12060
diff changeset
   817
    def checknested(self, path):
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12060
diff changeset
   818
        return self._repo._checknested(self._repo.wjoin(path))
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12060
diff changeset
   819
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
   820
    @annotatesubrepoerror
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   821
    def commit(self, text, user, date):
14898
95ced9f5bf29 subrepo: don't commit in subrepo if it's clean
Kevin Bullock <kbullock@ringworld.org>
parents: 14820
diff changeset
   822
        # don't bother committing in the subrepo if it's only been
95ced9f5bf29 subrepo: don't commit in subrepo if it's clean
Kevin Bullock <kbullock@ringworld.org>
parents: 14820
diff changeset
   823
        # updated
95ced9f5bf29 subrepo: don't commit in subrepo if it's clean
Kevin Bullock <kbullock@ringworld.org>
parents: 14820
diff changeset
   824
        if not self.dirty(True):
95ced9f5bf29 subrepo: don't commit in subrepo if it's clean
Kevin Bullock <kbullock@ringworld.org>
parents: 14820
diff changeset
   825
            return self._repo['.'].hex()
23574
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   826
        self.ui.debug("committing subrepo %s\n" % subrelpath(self))
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   827
        n = self._repo.commit(text, user, date)
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   828
        if not n:
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   829
            return self._repo['.'].hex() # different version checked out
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   830
        return node.hex(n)
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   831
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
   832
    @annotatesubrepoerror
20176
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   833
    def phase(self, state):
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   834
        return self._repo[state].phase()
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   835
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   836
    @annotatesubrepoerror
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   837
    def remove(self):
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   838
        # we can't fully delete the repository as it may contain
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   839
        # local-only history
23574
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   840
        self.ui.note(_('removing subrepo %s\n') % subrelpath(self))
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   841
        hg.clean(self._repo, node.nullid, False)
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   842
9507
5987183d6e59 subrepo: add auto-pull for merge
Matt Mackall <mpm@selenic.com>
parents: 9186
diff changeset
   843
    def _get(self, state):
10177
5ca0d220ae21 subrepo: add table-based dispatch for subrepo types
Augie Fackler <durin42@gmail.com>
parents: 10175
diff changeset
   844
        source, revision, kind = state
20317
d6939f29b3b3 subrepo: do not try to get hidden revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20176
diff changeset
   845
        if revision in self._repo.unfiltered():
20319
427d672c0e4e subrepo: make it possible to update to hidden subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20318
diff changeset
   846
            return True
20318
c5aef7a66607 subrepo: remove unnecessary else clause in hgsubrepo._get
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20317
diff changeset
   847
        self._repo._subsource = source
c5aef7a66607 subrepo: remove unnecessary else clause in hgsubrepo._get
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20317
diff changeset
   848
        srcurl = _abssource(self._repo)
c5aef7a66607 subrepo: remove unnecessary else clause in hgsubrepo._get
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20317
diff changeset
   849
        other = hg.peer(self._repo, {}, srcurl)
c5aef7a66607 subrepo: remove unnecessary else clause in hgsubrepo._get
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20317
diff changeset
   850
        if len(self._repo) == 0:
23574
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   851
            self.ui.status(_('cloning subrepo %s from %s\n')
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   852
                           % (subrelpath(self), srcurl))
20318
c5aef7a66607 subrepo: remove unnecessary else clause in hgsubrepo._get
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20317
diff changeset
   853
            parentrepo = self._repo._subparent
24690
d1ddf1fe5d33 subrepo: use vfs.rmtree instead of shutil.rmtree
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24688
diff changeset
   854
            # use self._repo.vfs instead of self.wvfs to remove .hg only
d1ddf1fe5d33 subrepo: use vfs.rmtree instead of shutil.rmtree
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24688
diff changeset
   855
            self._repo.vfs.rmtree()
20318
c5aef7a66607 subrepo: remove unnecessary else clause in hgsubrepo._get
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20317
diff changeset
   856
            other, cloned = hg.clone(self._repo._subparent.baseui, {},
c5aef7a66607 subrepo: remove unnecessary else clause in hgsubrepo._get
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20317
diff changeset
   857
                                     other, self._repo.root,
c5aef7a66607 subrepo: remove unnecessary else clause in hgsubrepo._get
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20317
diff changeset
   858
                                     update=False)
c5aef7a66607 subrepo: remove unnecessary else clause in hgsubrepo._get
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20317
diff changeset
   859
            self._repo = cloned.local()
c5aef7a66607 subrepo: remove unnecessary else clause in hgsubrepo._get
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20317
diff changeset
   860
            self._initrepo(parentrepo, source, create=True)
c5aef7a66607 subrepo: remove unnecessary else clause in hgsubrepo._get
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20317
diff changeset
   861
            self._cachestorehash(srcurl)
20317
d6939f29b3b3 subrepo: do not try to get hidden revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20176
diff changeset
   862
        else:
23574
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   863
            self.ui.status(_('pulling subrepo %s from %s\n')
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   864
                           % (subrelpath(self), srcurl))
20318
c5aef7a66607 subrepo: remove unnecessary else clause in hgsubrepo._get
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20317
diff changeset
   865
            cleansub = self.storeclean(srcurl)
22695
15a70ca40b22 subrepo: use exchange.pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22657
diff changeset
   866
            exchange.pull(self._repo, other)
20318
c5aef7a66607 subrepo: remove unnecessary else clause in hgsubrepo._get
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20317
diff changeset
   867
            if cleansub:
c5aef7a66607 subrepo: remove unnecessary else clause in hgsubrepo._get
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20317
diff changeset
   868
                # keep the repo clean after pull
18939
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   869
                self._cachestorehash(srcurl)
20319
427d672c0e4e subrepo: make it possible to update to hidden subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20318
diff changeset
   870
        return False
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   871
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
   872
    @annotatesubrepoerror
13322
c19b9282d3a7 subrepo: make update -C clean the working directory for svn subrepos
Erik Zielke <ez@aragost.com>
parents: 13287
diff changeset
   873
    def get(self, state, overwrite=False):
20319
427d672c0e4e subrepo: make it possible to update to hidden subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20318
diff changeset
   874
        inrepo = self._get(state)
10177
5ca0d220ae21 subrepo: add table-based dispatch for subrepo types
Augie Fackler <durin42@gmail.com>
parents: 10175
diff changeset
   875
        source, revision, kind = state
20319
427d672c0e4e subrepo: make it possible to update to hidden subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20318
diff changeset
   876
        repo = self._repo
427d672c0e4e subrepo: make it possible to update to hidden subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20318
diff changeset
   877
        repo.ui.debug("getting subrepo %s\n" % self._path)
427d672c0e4e subrepo: make it possible to update to hidden subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20318
diff changeset
   878
        if inrepo:
427d672c0e4e subrepo: make it possible to update to hidden subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20318
diff changeset
   879
            urepo = repo.unfiltered()
427d672c0e4e subrepo: make it possible to update to hidden subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20318
diff changeset
   880
            ctx = urepo[revision]
427d672c0e4e subrepo: make it possible to update to hidden subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20318
diff changeset
   881
            if ctx.hidden():
427d672c0e4e subrepo: make it possible to update to hidden subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20318
diff changeset
   882
                urepo.ui.warn(
427d672c0e4e subrepo: make it possible to update to hidden subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20318
diff changeset
   883
                    _('revision %s in subrepo %s is hidden\n') \
427d672c0e4e subrepo: make it possible to update to hidden subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20318
diff changeset
   884
                    % (revision[0:12], self._path))
427d672c0e4e subrepo: make it possible to update to hidden subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20318
diff changeset
   885
                repo = urepo
427d672c0e4e subrepo: make it possible to update to hidden subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20318
diff changeset
   886
        hg.updaterepo(repo, revision, overwrite)
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   887
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
   888
    @annotatesubrepoerror
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   889
    def merge(self, state):
9507
5987183d6e59 subrepo: add auto-pull for merge
Matt Mackall <mpm@selenic.com>
parents: 9186
diff changeset
   890
        self._get(state)
9781
eccc8aacd6f9 subrepo: do a linear update when appropriate
Matt Mackall <mpm@selenic.com>
parents: 9780
diff changeset
   891
        cur = self._repo['.']
eccc8aacd6f9 subrepo: do a linear update when appropriate
Matt Mackall <mpm@selenic.com>
parents: 9780
diff changeset
   892
        dst = self._repo[state[1]]
10251
a19d2993385d subrepo: fix merging of already merged subrepos (issue1986)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10068
diff changeset
   893
        anc = dst.ancestor(cur)
13417
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   894
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   895
        def mergefunc():
16196
8ae7626d8bf1 subrepo: fix for merge inconsistencies
Friedrich Kastner-Masilko <kastner_masilko@at.festo.com>
parents: 16022
diff changeset
   896
            if anc == cur and dst.branch() == cur.branch():
23574
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   897
                self.ui.debug("updating subrepo %s\n" % subrelpath(self))
13417
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   898
                hg.update(self._repo, state[1])
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   899
            elif anc == dst:
23574
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   900
                self.ui.debug("skipping subrepo %s\n" % subrelpath(self))
13417
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   901
            else:
23574
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   902
                self.ui.debug("merging subrepo %s\n" % subrelpath(self))
13417
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   903
                hg.merge(self._repo, state[1], remind=False)
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   904
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   905
        wctx = self._repo[None]
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   906
        if self.dirty():
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   907
            if anc != dst:
23574
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   908
                if _updateprompt(self.ui, self, wctx.dirty(), cur, dst):
13417
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   909
                    mergefunc()
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   910
            else:
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   911
                mergefunc()
9781
eccc8aacd6f9 subrepo: do a linear update when appropriate
Matt Mackall <mpm@selenic.com>
parents: 9780
diff changeset
   912
        else:
13417
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
   913
            mergefunc()
8815
e87b0fc4750b subrepo: basic push support
Matt Mackall <mpm@selenic.com>
parents: 8814
diff changeset
   914
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
   915
    @annotatesubrepoerror
15708
309e49491253 push: propagate --new-branch and --ssh options when pushing subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 15614
diff changeset
   916
    def push(self, opts):
309e49491253 push: propagate --new-branch and --ssh options when pushing subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 15614
diff changeset
   917
        force = opts.get('force')
309e49491253 push: propagate --new-branch and --ssh options when pushing subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 15614
diff changeset
   918
        newbranch = opts.get('new_branch')
309e49491253 push: propagate --new-branch and --ssh options when pushing subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 15614
diff changeset
   919
        ssh = opts.get('ssh')
309e49491253 push: propagate --new-branch and --ssh options when pushing subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 15614
diff changeset
   920
8815
e87b0fc4750b subrepo: basic push support
Matt Mackall <mpm@selenic.com>
parents: 8814
diff changeset
   921
        # push subrepos depth-first for coherent ordering
e87b0fc4750b subrepo: basic push support
Matt Mackall <mpm@selenic.com>
parents: 8814
diff changeset
   922
        c = self._repo['']
e87b0fc4750b subrepo: basic push support
Matt Mackall <mpm@selenic.com>
parents: 8814
diff changeset
   923
        subs = c.substate # only repos that are committed
e87b0fc4750b subrepo: basic push support
Matt Mackall <mpm@selenic.com>
parents: 8814
diff changeset
   924
        for s in sorted(subs):
16022
04604d1a9fc3 push: more precise failure check on subrepo push
Matt Mackall <mpm@selenic.com>
parents: 15912
diff changeset
   925
            if c.sub(s).push(opts) == 0:
11067
49e14ec67144 subrepo: propagate and catch push failures
Matt Mackall <mpm@selenic.com>
parents: 10954
diff changeset
   926
                return False
8815
e87b0fc4750b subrepo: basic push support
Matt Mackall <mpm@selenic.com>
parents: 8814
diff changeset
   927
e87b0fc4750b subrepo: basic push support
Matt Mackall <mpm@selenic.com>
parents: 8814
diff changeset
   928
        dsturl = _abssource(self._repo, True)
18940
798bdb7f1517 subrepo: do not push mercurial subrepos whose store is clean
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18939
diff changeset
   929
        if not force:
798bdb7f1517 subrepo: do not push mercurial subrepos whose store is clean
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18939
diff changeset
   930
            if self.storeclean(dsturl):
23574
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   931
                self.ui.status(
18940
798bdb7f1517 subrepo: do not push mercurial subrepos whose store is clean
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18939
diff changeset
   932
                    _('no changes made to subrepo %s since last push to %s\n')
798bdb7f1517 subrepo: do not push mercurial subrepos whose store is clean
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18939
diff changeset
   933
                    % (subrelpath(self), dsturl))
798bdb7f1517 subrepo: do not push mercurial subrepos whose store is clean
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18939
diff changeset
   934
                return None
23574
faa3d6af154e subrepo: use 'self.ui' instead of 'self._repo.ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23573
diff changeset
   935
        self.ui.status(_('pushing subrepo %s to %s\n') %
12752
18b5b6392fcf subrepo: rename relpath to subrelpath and introduce reporelpath
Mads Kiilerich <mads@kiilerich.com>
parents: 12506
diff changeset
   936
            (subrelpath(self), dsturl))
17874
2ba70eec1cf0 peer: subrepo isolation, pass repo instead of repo.ui to hg.peer
Simon Heimberg <simohe@besonet.ch>
parents: 17873
diff changeset
   937
        other = hg.peer(self._repo, {'ssh': ssh}, dsturl)
22619
f6cf96804d27 push: `exchange.push` instead of `localrepo.push`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22590
diff changeset
   938
        res = exchange.push(self._repo, other, force, newbranch=newbranch)
18939
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   939
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   940
        # the repo is now clean
aab0c14c20d0 subrepo: implement "storeclean" method for mercurial subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18937
diff changeset
   941
        self._cachestorehash(dsturl)
22619
f6cf96804d27 push: `exchange.push` instead of `localrepo.push`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22590
diff changeset
   942
        return res.cgresult
10177
5ca0d220ae21 subrepo: add table-based dispatch for subrepo types
Augie Fackler <durin42@gmail.com>
parents: 10175
diff changeset
   943
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
   944
    @annotatesubrepoerror
12272
42ecd56399d7 outgoing: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12270
diff changeset
   945
    def outgoing(self, ui, dest, opts):
24875
5135c2be6959 subrepo: don't pass the outer repo's --rev or --branch to subrepo outgoing()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24858
diff changeset
   946
        if 'rev' in opts or 'branch' in opts:
5135c2be6959 subrepo: don't pass the outer repo's --rev or --branch to subrepo outgoing()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24858
diff changeset
   947
            opts = copy.copy(opts)
5135c2be6959 subrepo: don't pass the outer repo's --rev or --branch to subrepo outgoing()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24858
diff changeset
   948
            opts.pop('rev', None)
5135c2be6959 subrepo: don't pass the outer repo's --rev or --branch to subrepo outgoing()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24858
diff changeset
   949
            opts.pop('branch', None)
12272
42ecd56399d7 outgoing: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12270
diff changeset
   950
        return hg.outgoing(ui, self._repo, _abssource(self._repo, True), opts)
42ecd56399d7 outgoing: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12270
diff changeset
   951
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
   952
    @annotatesubrepoerror
12274
c02e1ed3d407 incoming: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12272
diff changeset
   953
    def incoming(self, ui, source, opts):
24876
b5513ee85dd8 subrepo: don't pass the outer repo's --rev or --branch to subrepo incoming()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24875
diff changeset
   954
        if 'rev' in opts or 'branch' in opts:
b5513ee85dd8 subrepo: don't pass the outer repo's --rev or --branch to subrepo incoming()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24875
diff changeset
   955
            opts = copy.copy(opts)
b5513ee85dd8 subrepo: don't pass the outer repo's --rev or --branch to subrepo incoming()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24875
diff changeset
   956
            opts.pop('rev', None)
b5513ee85dd8 subrepo: don't pass the outer repo's --rev or --branch to subrepo incoming()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24875
diff changeset
   957
            opts.pop('branch', None)
12274
c02e1ed3d407 incoming: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12272
diff changeset
   958
        return hg.incoming(ui, self._repo, _abssource(self._repo, False), opts)
c02e1ed3d407 incoming: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12272
diff changeset
   959
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
   960
    @annotatesubrepoerror
12322
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   961
    def files(self):
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   962
        rev = self._state[1]
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   963
        ctx = self._repo[rev]
24173
2cc8ee4c4e1c subrepo: return only the manifest keys from hgsubrepo.files()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24148
diff changeset
   964
        return ctx.manifest().keys()
12322
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   965
31099
b44ab288358e subrepo: run the repo decoders when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 30755
diff changeset
   966
    def filedata(self, name, decode):
12322
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   967
        rev = self._state[1]
31099
b44ab288358e subrepo: run the repo decoders when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 30755
diff changeset
   968
        data = self._repo[rev][name].data()
b44ab288358e subrepo: run the repo decoders when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 30755
diff changeset
   969
        if decode:
b44ab288358e subrepo: run the repo decoders when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 30755
diff changeset
   970
            data = self._repo.wwritedata(name, data)
b44ab288358e subrepo: run the repo decoders when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 30755
diff changeset
   971
        return data
12322
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   972
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   973
    def fileflags(self, name):
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   974
        rev = self._state[1]
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   975
        ctx = self._repo[rev]
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   976
        return ctx.flags(name)
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
   977
24413
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24409
diff changeset
   978
    @annotatesubrepoerror
25228
63a57a2727b6 files: recurse into subrepos automatically with an explicit path
Matt Harbison <matt_harbison@yahoo.com>
parents: 25172
diff changeset
   979
    def printfiles(self, ui, m, fm, fmt, subrepos):
24413
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24409
diff changeset
   980
        # If the parent context is a workingctx, use the workingctx here for
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24409
diff changeset
   981
        # consistency.
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24409
diff changeset
   982
        if self._ctx.rev() is None:
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24409
diff changeset
   983
            ctx = self._repo[None]
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24409
diff changeset
   984
        else:
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24409
diff changeset
   985
            rev = self._state[1]
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24409
diff changeset
   986
            ctx = self._repo[rev]
25228
63a57a2727b6 files: recurse into subrepos automatically with an explicit path
Matt Harbison <matt_harbison@yahoo.com>
parents: 25172
diff changeset
   987
        return cmdutil.files(ui, ctx, m, fm, fmt, subrepos)
24413
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24409
diff changeset
   988
25121
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
   989
    @annotatesubrepoerror
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
   990
    def getfileset(self, expr):
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
   991
        if self._ctx.rev() is None:
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
   992
            ctx = self._repo[None]
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
   993
        else:
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
   994
            rev = self._state[1]
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
   995
            ctx = self._repo[rev]
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
   996
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
   997
        files = ctx.getfileset(expr)
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
   998
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
   999
        for subpath in ctx.substate:
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
  1000
            sub = ctx.sub(subpath)
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
  1001
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
  1002
            try:
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
  1003
                files.extend(subpath + '/' + f for f in sub.getfileset(expr))
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
  1004
            except error.LookupError:
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
  1005
                self.ui.status(_("skipping missing subrepository: %s\n")
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
  1006
                               % self.wvfs.reljoin(reporelpath(self), subpath))
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
  1007
        return files
df63d4843581 subrepo: introduce getfileset()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24943
diff changeset
  1008
15410
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15287
diff changeset
  1009
    def walk(self, match):
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15287
diff changeset
  1010
        ctx = self._repo[None]
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15287
diff changeset
  1011
        return ctx.walk(match)
12322
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
  1012
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
  1013
    @annotatesubrepoerror
23577
597b071a0e0d subrepo: drop the 'ui' parameter to forget()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23576
diff changeset
  1014
    def forget(self, match, prefix):
597b071a0e0d subrepo: drop the 'ui' parameter to forget()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23576
diff changeset
  1015
        return cmdutil.forget(self.ui, self._repo, match,
24675
47e7d5fbbf04 subrepo: use vfs.reljoin instead of os.path.join
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24674
diff changeset
  1016
                              self.wvfs.reljoin(prefix, self._path), True)
12322
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
  1017
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
  1018
    @annotatesubrepoerror
28607
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28017
diff changeset
  1019
    def removefiles(self, matcher, prefix, after, force, subrepos, warnings):
23578
d0546e8e1def subrepo: drop the 'ui' parameter to removefiles()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23577
diff changeset
  1020
        return cmdutil.remove(self.ui, self._repo, matcher,
24675
47e7d5fbbf04 subrepo: use vfs.reljoin instead of os.path.join
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24674
diff changeset
  1021
                              self.wvfs.reljoin(prefix, self._path),
47e7d5fbbf04 subrepo: use vfs.reljoin instead of os.path.join
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24674
diff changeset
  1022
                              after, force, subrepos)
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 22927
diff changeset
  1023
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 22927
diff changeset
  1024
    @annotatesubrepoerror
23579
e1c39f207719 subrepo: drop the 'ui' parameter to revert()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23578
diff changeset
  1025
    def revert(self, substate, *pats, **opts):
16430
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1026
        # reverting a subrepo is a 2 step process:
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1027
        # 1. if the no_backup is not set, revert all modified
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1028
        #    files inside the subrepo
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1029
        # 2. update the subrepo to the revision specified in
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1030
        #    the corresponding substate dictionary
23579
e1c39f207719 subrepo: drop the 'ui' parameter to revert()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23578
diff changeset
  1031
        self.ui.status(_('reverting subrepo %s\n') % substate[0])
16430
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1032
        if not opts.get('no_backup'):
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1033
            # Revert all files on the subrepo, creating backups
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1034
            # Note that this will not recursively revert subrepos
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1035
            # We could do it if there was a set:subrepos() predicate
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1036
            opts = opts.copy()
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1037
            opts['date'] = None
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1038
            opts['rev'] = substate[1]
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1039
23579
e1c39f207719 subrepo: drop the 'ui' parameter to revert()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23578
diff changeset
  1040
            self.filerevert(*pats, **opts)
16429
71dcce391a44 revert: add support for reverting subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16197
diff changeset
  1041
71dcce391a44 revert: add support for reverting subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16197
diff changeset
  1042
        # Update the repo to the revision specified in the given substate
24134
afed5d2e7985 revert: display full subrepo output with --dry-run
Matt Harbison <matt_harbison@yahoo.com>
parents: 24132
diff changeset
  1043
        if not opts.get('dry_run'):
afed5d2e7985 revert: display full subrepo output with --dry-run
Matt Harbison <matt_harbison@yahoo.com>
parents: 24132
diff changeset
  1044
            self.get(substate, overwrite=True)
16429
71dcce391a44 revert: add support for reverting subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16197
diff changeset
  1045
23579
e1c39f207719 subrepo: drop the 'ui' parameter to revert()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23578
diff changeset
  1046
    def filerevert(self, *pats, **opts):
16430
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1047
        ctx = self._repo[opts['rev']]
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1048
        parents = self._repo.dirstate.parents()
18943
27e8dfc2c338 subrepo: fix exception on revert when "all" option is omitted
Yuya Nishihara <yuya@tcha.org>
parents: 18940
diff changeset
  1049
        if opts.get('all'):
16430
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1050
            pats = ['set:modified()']
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1051
        else:
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1052
            pats = []
23579
e1c39f207719 subrepo: drop the 'ui' parameter to revert()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23578
diff changeset
  1053
        cmdutil.revert(self.ui, self._repo, ctx, parents, *pats, **opts)
16430
6883c2363f44 revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16429
diff changeset
  1054
21400
78a60daacea8 subrepo: add shortid() method to subrepo classes
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21041
diff changeset
  1055
    def shortid(self, revid):
78a60daacea8 subrepo: add shortid() method to subrepo classes
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21041
diff changeset
  1056
        return revid[:12]
78a60daacea8 subrepo: add shortid() method to subrepo classes
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21041
diff changeset
  1057
25591
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1058
    def verify(self):
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1059
        try:
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1060
            rev = self._state[1]
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1061
            ctx = self._repo.unfiltered()[rev]
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1062
            if ctx.hidden():
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1063
                # Since hidden revisions aren't pushed/pulled, it seems worth an
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1064
                # explicit warning.
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1065
                ui = self._repo.ui
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1066
                ui.warn(_("subrepo '%s' is hidden in revision %s\n") %
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1067
                        (self._relpath, node.short(self._ctx.node())))
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1068
            return 0
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1069
        except error.RepoLookupError:
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1070
            # A missing subrepo revision may be a case of needing to pull it, so
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1071
            # don't treat this as an error.
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1072
            self._repo.ui.warn(_("subrepo '%s' not found in revision %s\n") %
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1073
                               (self._relpath, node.short(self._ctx.node())))
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1074
            return 0
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25572
diff changeset
  1075
24672
dd0b86f740ef subrepo: add wvfs field to access the working directory via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24671
diff changeset
  1076
    @propertycache
dd0b86f740ef subrepo: add wvfs field to access the working directory via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24671
diff changeset
  1077
    def wvfs(self):
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26587
diff changeset
  1078
        """return own wvfs for efficiency and consistency
24672
dd0b86f740ef subrepo: add wvfs field to access the working directory via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24671
diff changeset
  1079
        """
dd0b86f740ef subrepo: add wvfs field to access the working directory via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24671
diff changeset
  1080
        return self._repo.wvfs
dd0b86f740ef subrepo: add wvfs field to access the working directory via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24671
diff changeset
  1081
24786
56e15db9109f subrepo: calculate _relpath for hgsubrepo based on self instead of parent
Matt Harbison <matt_harbison@yahoo.com>
parents: 24785
diff changeset
  1082
    @propertycache
56e15db9109f subrepo: calculate _relpath for hgsubrepo based on self instead of parent
Matt Harbison <matt_harbison@yahoo.com>
parents: 24785
diff changeset
  1083
    def _relpath(self):
56e15db9109f subrepo: calculate _relpath for hgsubrepo based on self instead of parent
Matt Harbison <matt_harbison@yahoo.com>
parents: 24785
diff changeset
  1084
        """return path to this subrepository as seen from outermost repository
56e15db9109f subrepo: calculate _relpath for hgsubrepo based on self instead of parent
Matt Harbison <matt_harbison@yahoo.com>
parents: 24785
diff changeset
  1085
        """
56e15db9109f subrepo: calculate _relpath for hgsubrepo based on self instead of parent
Matt Harbison <matt_harbison@yahoo.com>
parents: 24785
diff changeset
  1086
        # Keep consistent dir separators by avoiding vfs.join(self._path)
56e15db9109f subrepo: calculate _relpath for hgsubrepo based on self instead of parent
Matt Harbison <matt_harbison@yahoo.com>
parents: 24785
diff changeset
  1087
        return reporelpath(self._repo)
56e15db9109f subrepo: calculate _relpath for hgsubrepo based on self instead of parent
Matt Harbison <matt_harbison@yahoo.com>
parents: 24785
diff changeset
  1088
11559
9d88597470af subrepo: add abstract superclass for subrepo classes
Martin Geisler <mg@lazybytes.net>
parents: 11470
diff changeset
  1089
class svnsubrepo(abstractsubrepo):
29021
92d37fb3f1aa verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28949
diff changeset
  1090
    def __init__(self, ctx, path, state, allowcreate):
24671
98ab035e9332 subrepo: change arguments of abstractsubrepo.__init__ (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24645
diff changeset
  1091
        super(svnsubrepo, self).__init__(ctx, path)
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1092
        self._state = state
15190
6dc67dced8c1 subrepo: improve error message when svn isn't found
Matt Mackall <mpm@selenic.com>
parents: 15150
diff changeset
  1093
        self._exe = util.findexe('svn')
6dc67dced8c1 subrepo: improve error message when svn isn't found
Matt Mackall <mpm@selenic.com>
parents: 15150
diff changeset
  1094
        if not self._exe:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
  1095
            raise error.Abort(_("'svn' executable not found for subrepo '%s'")
15190
6dc67dced8c1 subrepo: improve error message when svn isn't found
Matt Mackall <mpm@selenic.com>
parents: 15150
diff changeset
  1096
                             % self._path)
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1097
14664
0ae98cd2a83f svn subrepos: work around checkout obstructions (issue2752)
Augie Fackler <durin42@gmail.com>
parents: 14556
diff changeset
  1098
    def _svncommand(self, commands, filename='', failok=False):
15190
6dc67dced8c1 subrepo: improve error message when svn isn't found
Matt Mackall <mpm@selenic.com>
parents: 15150
diff changeset
  1099
        cmd = [self._exe]
14506
733af5d9f6b2 subrepo: make stdin for svn a pipe for non-interactive use (issue2759)
Augie Fackler <durin42@gmail.com>
parents: 14505
diff changeset
  1100
        extrakw = {}
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1101
        if not self.ui.interactive():
14506
733af5d9f6b2 subrepo: make stdin for svn a pipe for non-interactive use (issue2759)
Augie Fackler <durin42@gmail.com>
parents: 14505
diff changeset
  1102
            # Making stdin be a pipe should prevent svn from behaving
733af5d9f6b2 subrepo: make stdin for svn a pipe for non-interactive use (issue2759)
Augie Fackler <durin42@gmail.com>
parents: 14505
diff changeset
  1103
            # interactively even if we can't pass --non-interactive.
733af5d9f6b2 subrepo: make stdin for svn a pipe for non-interactive use (issue2759)
Augie Fackler <durin42@gmail.com>
parents: 14505
diff changeset
  1104
            extrakw['stdin'] = subprocess.PIPE
733af5d9f6b2 subrepo: make stdin for svn a pipe for non-interactive use (issue2759)
Augie Fackler <durin42@gmail.com>
parents: 14505
diff changeset
  1105
            # Starting in svn 1.5 --non-interactive is a global flag
733af5d9f6b2 subrepo: make stdin for svn a pipe for non-interactive use (issue2759)
Augie Fackler <durin42@gmail.com>
parents: 14505
diff changeset
  1106
            # instead of being per-command, but we need to support 1.4 so
733af5d9f6b2 subrepo: make stdin for svn a pipe for non-interactive use (issue2759)
Augie Fackler <durin42@gmail.com>
parents: 14505
diff changeset
  1107
            # we have to be intelligent about what commands take
733af5d9f6b2 subrepo: make stdin for svn a pipe for non-interactive use (issue2759)
Augie Fackler <durin42@gmail.com>
parents: 14505
diff changeset
  1108
            # --non-interactive.
733af5d9f6b2 subrepo: make stdin for svn a pipe for non-interactive use (issue2759)
Augie Fackler <durin42@gmail.com>
parents: 14505
diff changeset
  1109
            if commands[0] in ('update', 'checkout', 'commit'):
733af5d9f6b2 subrepo: make stdin for svn a pipe for non-interactive use (issue2759)
Augie Fackler <durin42@gmail.com>
parents: 14505
diff changeset
  1110
                cmd.append('--non-interactive')
14025
1052b1421a48 subrepo: tell Subversion when we are non-interactive (issue2759)
Augie Fackler <durin42@gmail.com>
parents: 13912
diff changeset
  1111
        cmd.extend(commands)
14050
9e8a9d45945c subrepo: handle svn tracked/unknown directory collisions
Patrick Mezard <pmezard@gmail.com>
parents: 14025
diff changeset
  1112
        if filename is not None:
24675
47e7d5fbbf04 subrepo: use vfs.reljoin instead of os.path.join
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24674
diff changeset
  1113
            path = self.wvfs.reljoin(self._ctx.repo().origroot,
47e7d5fbbf04 subrepo: use vfs.reljoin instead of os.path.join
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24674
diff changeset
  1114
                                     self._path, filename)
14050
9e8a9d45945c subrepo: handle svn tracked/unknown directory collisions
Patrick Mezard <pmezard@gmail.com>
parents: 14025
diff changeset
  1115
            cmd.append(path)
30635
a150173da1c1 py3: replace os.environ with encoding.environ (part 2 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30615
diff changeset
  1116
        env = dict(encoding.environ)
10271
9b38bec5dc29 subrepo: make svn use C locale for portability
Patrick Mezard <pmezard@gmail.com>
parents: 10264
diff changeset
  1117
        # Avoid localized output, preserve current locale for everything else.
17705
6929b9c70be9 subrepo: setting LC_MESSAGES only works if LC_ALL is empty or unset
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17441
diff changeset
  1118
        lc_all = env.get('LC_ALL')
6929b9c70be9 subrepo: setting LC_MESSAGES only works if LC_ALL is empty or unset
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17441
diff changeset
  1119
        if lc_all:
6929b9c70be9 subrepo: setting LC_MESSAGES only works if LC_ALL is empty or unset
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17441
diff changeset
  1120
            env['LANG'] = lc_all
6929b9c70be9 subrepo: setting LC_MESSAGES only works if LC_ALL is empty or unset
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17441
diff changeset
  1121
            del env['LC_ALL']
10271
9b38bec5dc29 subrepo: make svn use C locale for portability
Patrick Mezard <pmezard@gmail.com>
parents: 10264
diff changeset
  1122
        env['LC_MESSAGES'] = 'C'
13108
dcaad69cfd6a subrepo: use subprocess.Popen without the shell
Eric Eisner <ede@mit.edu>
parents: 13107
diff changeset
  1123
        p = subprocess.Popen(cmd, bufsize=-1, close_fds=util.closefds,
13014
d1c52354b0a9 subrepo: use subprocess directly to avoid python 2.6 bug
Patrick Mezard <pmezard@gmail.com>
parents: 13013
diff changeset
  1124
                             stdout=subprocess.PIPE, stderr=subprocess.PIPE,
14506
733af5d9f6b2 subrepo: make stdin for svn a pipe for non-interactive use (issue2759)
Augie Fackler <durin42@gmail.com>
parents: 14505
diff changeset
  1125
                              universal_newlines=True, env=env, **extrakw)
13014
d1c52354b0a9 subrepo: use subprocess directly to avoid python 2.6 bug
Patrick Mezard <pmezard@gmail.com>
parents: 13013
diff changeset
  1126
        stdout, stderr = p.communicate()
d1c52354b0a9 subrepo: use subprocess directly to avoid python 2.6 bug
Patrick Mezard <pmezard@gmail.com>
parents: 13013
diff changeset
  1127
        stderr = stderr.strip()
14664
0ae98cd2a83f svn subrepos: work around checkout obstructions (issue2752)
Augie Fackler <durin42@gmail.com>
parents: 14556
diff changeset
  1128
        if not failok:
0ae98cd2a83f svn subrepos: work around checkout obstructions (issue2752)
Augie Fackler <durin42@gmail.com>
parents: 14556
diff changeset
  1129
            if p.returncode:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
  1130
                raise error.Abort(stderr or 'exited with code %d'
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
  1131
                                  % p.returncode)
14664
0ae98cd2a83f svn subrepos: work around checkout obstructions (issue2752)
Augie Fackler <durin42@gmail.com>
parents: 14556
diff changeset
  1132
            if stderr:
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1133
                self.ui.warn(stderr + '\n')
14664
0ae98cd2a83f svn subrepos: work around checkout obstructions (issue2752)
Augie Fackler <durin42@gmail.com>
parents: 14556
diff changeset
  1134
        return stdout, stderr
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1135
14050
9e8a9d45945c subrepo: handle svn tracked/unknown directory collisions
Patrick Mezard <pmezard@gmail.com>
parents: 14025
diff changeset
  1136
    @propertycache
9e8a9d45945c subrepo: handle svn tracked/unknown directory collisions
Patrick Mezard <pmezard@gmail.com>
parents: 14025
diff changeset
  1137
    def _svnversion(self):
17707
35674bd95200 subrepo, hghave: use "svn --version --quiet" to determine version number
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17706
diff changeset
  1138
        output, err = self._svncommand(['--version', '--quiet'], filename=None)
35674bd95200 subrepo, hghave: use "svn --version --quiet" to determine version number
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17706
diff changeset
  1139
        m = re.search(r'^(\d+)\.(\d+)', output)
14050
9e8a9d45945c subrepo: handle svn tracked/unknown directory collisions
Patrick Mezard <pmezard@gmail.com>
parents: 14025
diff changeset
  1140
        if not m:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
  1141
            raise error.Abort(_('cannot retrieve svn tool version'))
14050
9e8a9d45945c subrepo: handle svn tracked/unknown directory collisions
Patrick Mezard <pmezard@gmail.com>
parents: 14025
diff changeset
  1142
        return (int(m.group(1)), int(m.group(2)))
9e8a9d45945c subrepo: handle svn tracked/unknown directory collisions
Patrick Mezard <pmezard@gmail.com>
parents: 14025
diff changeset
  1143
13287
d0e0d3d43e14 subrepo: compare svn subrepo state to last committed revision
Patrick Mezard <pmezard@gmail.com>
parents: 13117
diff changeset
  1144
    def _wcrevs(self):
d0e0d3d43e14 subrepo: compare svn subrepo state to last committed revision
Patrick Mezard <pmezard@gmail.com>
parents: 13117
diff changeset
  1145
        # Get the working directory revision as well as the last
d0e0d3d43e14 subrepo: compare svn subrepo state to last committed revision
Patrick Mezard <pmezard@gmail.com>
parents: 13117
diff changeset
  1146
        # commit revision so we can compare the subrepo state with
d0e0d3d43e14 subrepo: compare svn subrepo state to last committed revision
Patrick Mezard <pmezard@gmail.com>
parents: 13117
diff changeset
  1147
        # both. We used to store the working directory one.
14664
0ae98cd2a83f svn subrepos: work around checkout obstructions (issue2752)
Augie Fackler <durin42@gmail.com>
parents: 14556
diff changeset
  1148
        output, err = self._svncommand(['info', '--xml'])
10272
886858b834da subrepo: svn xml output is much easier to parse
Patrick Mezard <pmezard@gmail.com>
parents: 10271
diff changeset
  1149
        doc = xml.dom.minidom.parseString(output)
886858b834da subrepo: svn xml output is much easier to parse
Patrick Mezard <pmezard@gmail.com>
parents: 10271
diff changeset
  1150
        entries = doc.getElementsByTagName('entry')
13287
d0e0d3d43e14 subrepo: compare svn subrepo state to last committed revision
Patrick Mezard <pmezard@gmail.com>
parents: 13117
diff changeset
  1151
        lastrev, rev = '0', '0'
d0e0d3d43e14 subrepo: compare svn subrepo state to last committed revision
Patrick Mezard <pmezard@gmail.com>
parents: 13117
diff changeset
  1152
        if entries:
d0e0d3d43e14 subrepo: compare svn subrepo state to last committed revision
Patrick Mezard <pmezard@gmail.com>
parents: 13117
diff changeset
  1153
            rev = str(entries[0].getAttribute('revision')) or '0'
d0e0d3d43e14 subrepo: compare svn subrepo state to last committed revision
Patrick Mezard <pmezard@gmail.com>
parents: 13117
diff changeset
  1154
            commits = entries[0].getElementsByTagName('commit')
d0e0d3d43e14 subrepo: compare svn subrepo state to last committed revision
Patrick Mezard <pmezard@gmail.com>
parents: 13117
diff changeset
  1155
            if commits:
d0e0d3d43e14 subrepo: compare svn subrepo state to last committed revision
Patrick Mezard <pmezard@gmail.com>
parents: 13117
diff changeset
  1156
                lastrev = str(commits[0].getAttribute('revision')) or '0'
d0e0d3d43e14 subrepo: compare svn subrepo state to last committed revision
Patrick Mezard <pmezard@gmail.com>
parents: 13117
diff changeset
  1157
        return (lastrev, rev)
d0e0d3d43e14 subrepo: compare svn subrepo state to last committed revision
Patrick Mezard <pmezard@gmail.com>
parents: 13117
diff changeset
  1158
d0e0d3d43e14 subrepo: compare svn subrepo state to last committed revision
Patrick Mezard <pmezard@gmail.com>
parents: 13117
diff changeset
  1159
    def _wcrev(self):
d0e0d3d43e14 subrepo: compare svn subrepo state to last committed revision
Patrick Mezard <pmezard@gmail.com>
parents: 13117
diff changeset
  1160
        return self._wcrevs()[0]
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1161
10273
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1162
    def _wcchanged(self):
16530
e37199a1f9d4 subrepo/svn: improve error message on missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16529
diff changeset
  1163
        """Return (changes, extchanges, missing) where changes is True
e37199a1f9d4 subrepo/svn: improve error message on missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16529
diff changeset
  1164
        if the working directory was changed, extchanges is
e37199a1f9d4 subrepo/svn: improve error message on missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16529
diff changeset
  1165
        True if any of these changes concern an external entry and missing
e37199a1f9d4 subrepo/svn: improve error message on missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16529
diff changeset
  1166
        is True if any change is a missing entry.
10273
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1167
        """
14664
0ae98cd2a83f svn subrepos: work around checkout obstructions (issue2752)
Augie Fackler <durin42@gmail.com>
parents: 14556
diff changeset
  1168
        output, err = self._svncommand(['status', '--xml'])
16530
e37199a1f9d4 subrepo/svn: improve error message on missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16529
diff changeset
  1169
        externals, changes, missing = [], [], []
10272
886858b834da subrepo: svn xml output is much easier to parse
Patrick Mezard <pmezard@gmail.com>
parents: 10271
diff changeset
  1170
        doc = xml.dom.minidom.parseString(output)
10273
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1171
        for e in doc.getElementsByTagName('entry'):
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1172
            s = e.getElementsByTagName('wc-status')
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1173
            if not s:
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1174
                continue
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1175
            item = s[0].getAttribute('item')
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1176
            props = s[0].getAttribute('props')
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1177
            path = e.getAttribute('path')
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1178
            if item == 'external':
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1179
                externals.append(path)
16530
e37199a1f9d4 subrepo/svn: improve error message on missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16529
diff changeset
  1180
            elif item == 'missing':
e37199a1f9d4 subrepo/svn: improve error message on missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16529
diff changeset
  1181
                missing.append(path)
10273
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1182
            if (item not in ('', 'normal', 'unversioned', 'external')
14994
a115b5ee9c63 subrepo: handle adding svn subrepo with a svn:external file in it (issue2931)
Vasily Titskiy <qehgt0@gmail.com>
parents: 14898
diff changeset
  1183
                or props not in ('', 'none', 'normal')):
10273
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1184
                changes.append(path)
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1185
        for path in changes:
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1186
            for ext in externals:
30615
bb77654dc7ae py3: replace os.sep with pycompat.ossep (part 3 of 4)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30060
diff changeset
  1187
                if path == ext or path.startswith(ext + pycompat.ossep):
16530
e37199a1f9d4 subrepo/svn: improve error message on missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16529
diff changeset
  1188
                    return True, True, bool(missing)
e37199a1f9d4 subrepo/svn: improve error message on missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16529
diff changeset
  1189
        return bool(changes), False, bool(missing)
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1190
13174
be7e8e9bc5e5 mq: update .hgsubstate if subrepos are clean (issue2499)
Kevin Bullock <kbullock@ringworld.org>
parents: 13172
diff changeset
  1191
    def dirty(self, ignoreupdate=False):
be7e8e9bc5e5 mq: update .hgsubstate if subrepos are clean (issue2499)
Kevin Bullock <kbullock@ringworld.org>
parents: 13172
diff changeset
  1192
        if not self._wcchanged()[0]:
13288
9c3bfba3f48d Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 13242 13287
diff changeset
  1193
            if self._state[1] in self._wcrevs() or ignoreupdate:
13174
be7e8e9bc5e5 mq: update .hgsubstate if subrepos are clean (issue2499)
Kevin Bullock <kbullock@ringworld.org>
parents: 13172
diff changeset
  1194
                return False
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1195
        return True
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1196
16072
bcb973abcc0b subrepo: add basestate method
Matt Mackall <mpm@selenic.com>
parents: 16022
diff changeset
  1197
    def basestate(self):
16554
ae2664ee0223 subrepo/svn: fix checked out rev number retrieval (issue2968)
Patrick Mezard <patrick@mezard.eu>
parents: 16530
diff changeset
  1198
        lastrev, rev = self._wcrevs()
ae2664ee0223 subrepo/svn: fix checked out rev number retrieval (issue2968)
Patrick Mezard <patrick@mezard.eu>
parents: 16530
diff changeset
  1199
        if lastrev != rev:
ae2664ee0223 subrepo/svn: fix checked out rev number retrieval (issue2968)
Patrick Mezard <patrick@mezard.eu>
parents: 16530
diff changeset
  1200
            # Last committed rev is not the same than rev. We would
ae2664ee0223 subrepo/svn: fix checked out rev number retrieval (issue2968)
Patrick Mezard <patrick@mezard.eu>
parents: 16530
diff changeset
  1201
            # like to take lastrev but we do not know if the subrepo
ae2664ee0223 subrepo/svn: fix checked out rev number retrieval (issue2968)
Patrick Mezard <patrick@mezard.eu>
parents: 16530
diff changeset
  1202
            # URL exists at lastrev.  Test it and fallback to rev it
ae2664ee0223 subrepo/svn: fix checked out rev number retrieval (issue2968)
Patrick Mezard <patrick@mezard.eu>
parents: 16530
diff changeset
  1203
            # is not there.
ae2664ee0223 subrepo/svn: fix checked out rev number retrieval (issue2968)
Patrick Mezard <patrick@mezard.eu>
parents: 16530
diff changeset
  1204
            try:
17035
ba0286e149aa subrepo/svn: make rev number retrieval compatible with svn 1.5 (issue2968)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17025
diff changeset
  1205
                self._svncommand(['list', '%s@%s' % (self._state[0], lastrev)])
16554
ae2664ee0223 subrepo/svn: fix checked out rev number retrieval (issue2968)
Patrick Mezard <patrick@mezard.eu>
parents: 16530
diff changeset
  1206
                return lastrev
ae2664ee0223 subrepo/svn: fix checked out rev number retrieval (issue2968)
Patrick Mezard <patrick@mezard.eu>
parents: 16530
diff changeset
  1207
            except error.Abort:
ae2664ee0223 subrepo/svn: fix checked out rev number retrieval (issue2968)
Patrick Mezard <patrick@mezard.eu>
parents: 16530
diff changeset
  1208
                pass
ae2664ee0223 subrepo/svn: fix checked out rev number retrieval (issue2968)
Patrick Mezard <patrick@mezard.eu>
parents: 16530
diff changeset
  1209
        return rev
16072
bcb973abcc0b subrepo: add basestate method
Matt Mackall <mpm@selenic.com>
parents: 16022
diff changeset
  1210
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
  1211
    @annotatesubrepoerror
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1212
    def commit(self, text, user, date):
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1213
        # user and date are out of our hands since svn is centralized
16530
e37199a1f9d4 subrepo/svn: improve error message on missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16529
diff changeset
  1214
        changed, extchanged, missing = self._wcchanged()
10273
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1215
        if not changed:
16554
ae2664ee0223 subrepo/svn: fix checked out rev number retrieval (issue2968)
Patrick Mezard <patrick@mezard.eu>
parents: 16530
diff changeset
  1216
            return self.basestate()
10273
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1217
        if extchanged:
e898bc7810ad subrepo: handle svn externals and meta changes (issue1982)
Patrick Mezard <pmezard@gmail.com>
parents: 10272
diff changeset
  1218
            # Do not try to commit externals
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
  1219
            raise error.Abort(_('cannot commit svn externals'))
16530
e37199a1f9d4 subrepo/svn: improve error message on missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16529
diff changeset
  1220
        if missing:
e37199a1f9d4 subrepo/svn: improve error message on missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16529
diff changeset
  1221
            # svn can commit with missing entries but aborting like hg
e37199a1f9d4 subrepo/svn: improve error message on missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16529
diff changeset
  1222
            # seems a better approach.
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
  1223
            raise error.Abort(_('cannot commit missing svn entries'))
14664
0ae98cd2a83f svn subrepos: work around checkout obstructions (issue2752)
Augie Fackler <durin42@gmail.com>
parents: 14556
diff changeset
  1224
        commitinfo, err = self._svncommand(['commit', '-m', text])
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1225
        self.ui.status(commitinfo)
12060
63eab3b74ba6 subrepo: use [0-9] instead of [\d] in svn subrepo regex
Martin Geisler <mg@lazybytes.net>
parents: 11961
diff changeset
  1226
        newrev = re.search('Committed revision ([0-9]+).', commitinfo)
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1227
        if not newrev:
16529
3d5d204a08c7 subrepo/svn: abort on commit with missing file (issue3029)
Patrick Mezard <patrick@mezard.eu>
parents: 16527
diff changeset
  1228
            if not commitinfo.strip():
3d5d204a08c7 subrepo/svn: abort on commit with missing file (issue3029)
Patrick Mezard <patrick@mezard.eu>
parents: 16527
diff changeset
  1229
                # Sometimes, our definition of "changed" differs from
3d5d204a08c7 subrepo/svn: abort on commit with missing file (issue3029)
Patrick Mezard <patrick@mezard.eu>
parents: 16527
diff changeset
  1230
                # svn one. For instance, svn ignores missing files
3d5d204a08c7 subrepo/svn: abort on commit with missing file (issue3029)
Patrick Mezard <patrick@mezard.eu>
parents: 16527
diff changeset
  1231
                # when committing. If there are only missing files, no
3d5d204a08c7 subrepo/svn: abort on commit with missing file (issue3029)
Patrick Mezard <patrick@mezard.eu>
parents: 16527
diff changeset
  1232
                # commit is made, no output and no error code.
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
  1233
                raise error.Abort(_('failed to commit svn changes'))
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
  1234
            raise error.Abort(commitinfo.splitlines()[-1])
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1235
        newrev = newrev.groups()[0]
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1236
        self.ui.status(self._svncommand(['update', '-r', newrev])[0])
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1237
        return newrev
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1238
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
  1239
    @annotatesubrepoerror
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1240
    def remove(self):
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1241
        if self.dirty():
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1242
            self.ui.warn(_('not removing repo %s because '
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1243
                           'it has changes.\n') % self._path)
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1244
            return
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1245
        self.ui.note(_('removing subrepo %s\n') % self._path)
13013
92b0d669637f subrepo: fix removing read-only svn files on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 12930
diff changeset
  1246
24690
d1ddf1fe5d33 subrepo: use vfs.rmtree instead of shutil.rmtree
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24688
diff changeset
  1247
        self.wvfs.rmtree(forcibly=True)
13015
82ca0c43bc44 subrepo: prune empty directories when removing svn subrepo
Patrick Mezard <pmezard@gmail.com>
parents: 13014
diff changeset
  1248
        try:
25773
de654a83fe1c subrepo: use vfs.dirname instead of os.path.dirname
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25771
diff changeset
  1249
            pwvfs = self._ctx.repo().wvfs
de654a83fe1c subrepo: use vfs.dirname instead of os.path.dirname
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25771
diff changeset
  1250
            pwvfs.removedirs(pwvfs.dirname(self._path))
13015
82ca0c43bc44 subrepo: prune empty directories when removing svn subrepo
Patrick Mezard <pmezard@gmail.com>
parents: 13014
diff changeset
  1251
        except OSError:
82ca0c43bc44 subrepo: prune empty directories when removing svn subrepo
Patrick Mezard <pmezard@gmail.com>
parents: 13014
diff changeset
  1252
            pass
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1253
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
  1254
    @annotatesubrepoerror
13322
c19b9282d3a7 subrepo: make update -C clean the working directory for svn subrepos
Erik Zielke <ez@aragost.com>
parents: 13287
diff changeset
  1255
    def get(self, state, overwrite=False):
c19b9282d3a7 subrepo: make update -C clean the working directory for svn subrepos
Erik Zielke <ez@aragost.com>
parents: 13287
diff changeset
  1256
        if overwrite:
13332
927e3940bfc3 subrepo: fix update -C with svn subrepos when cwd != repo.root
Patrick Mezard <pmezard@gmail.com>
parents: 13322
diff changeset
  1257
            self._svncommand(['revert', '--recursive'])
14050
9e8a9d45945c subrepo: handle svn tracked/unknown directory collisions
Patrick Mezard <pmezard@gmail.com>
parents: 14025
diff changeset
  1258
        args = ['checkout']
9e8a9d45945c subrepo: handle svn tracked/unknown directory collisions
Patrick Mezard <pmezard@gmail.com>
parents: 14025
diff changeset
  1259
        if self._svnversion >= (1, 5):
9e8a9d45945c subrepo: handle svn tracked/unknown directory collisions
Patrick Mezard <pmezard@gmail.com>
parents: 14025
diff changeset
  1260
            args.append('--force')
14820
7ef125fa9b35 subrepo: correct revision in svn checkout
Eli Carter <eli.carter@tektronix.com>
parents: 14766
diff changeset
  1261
        # The revision must be specified at the end of the URL to properly
7ef125fa9b35 subrepo: correct revision in svn checkout
Eli Carter <eli.carter@tektronix.com>
parents: 14766
diff changeset
  1262
        # update to a directory which has since been deleted and recreated.
7ef125fa9b35 subrepo: correct revision in svn checkout
Eli Carter <eli.carter@tektronix.com>
parents: 14766
diff changeset
  1263
        args.append('%s@%s' % (state[0], state[1]))
14664
0ae98cd2a83f svn subrepos: work around checkout obstructions (issue2752)
Augie Fackler <durin42@gmail.com>
parents: 14556
diff changeset
  1264
        status, err = self._svncommand(args, failok=True)
24724
95eb067b2b5e subrepo: pass wvfs to _sanitize instead of absolute path to a subrepository
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24695
diff changeset
  1265
        _sanitize(self.ui, self.wvfs, '.svn')
12060
63eab3b74ba6 subrepo: use [0-9] instead of [\d] in svn subrepo regex
Martin Geisler <mg@lazybytes.net>
parents: 11961
diff changeset
  1266
        if not re.search('Checked out revision [0-9]+.', status):
14664
0ae98cd2a83f svn subrepos: work around checkout obstructions (issue2752)
Augie Fackler <durin42@gmail.com>
parents: 14556
diff changeset
  1267
            if ('is already a working copy for a different URL' in err
16530
e37199a1f9d4 subrepo/svn: improve error message on missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16529
diff changeset
  1268
                and (self._wcchanged()[:2] == (False, False))):
14664
0ae98cd2a83f svn subrepos: work around checkout obstructions (issue2752)
Augie Fackler <durin42@gmail.com>
parents: 14556
diff changeset
  1269
                # obstructed but clean working copy, so just blow it away.
0ae98cd2a83f svn subrepos: work around checkout obstructions (issue2752)
Augie Fackler <durin42@gmail.com>
parents: 14556
diff changeset
  1270
                self.remove()
0ae98cd2a83f svn subrepos: work around checkout obstructions (issue2752)
Augie Fackler <durin42@gmail.com>
parents: 14556
diff changeset
  1271
                self.get(state, overwrite=False)
0ae98cd2a83f svn subrepos: work around checkout obstructions (issue2752)
Augie Fackler <durin42@gmail.com>
parents: 14556
diff changeset
  1272
                return
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
  1273
            raise error.Abort((status or err).splitlines()[-1])
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1274
        self.ui.status(status)
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1275
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
  1276
    @annotatesubrepoerror
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1277
    def merge(self, state):
13417
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1278
        old = self._state[1]
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1279
        new = state[1]
16555
4955e7bf085c subrepo/svn: cache _wcrev() value in merge()
Patrick Mezard <patrick@mezard.eu>
parents: 16554
diff changeset
  1280
        wcrev = self._wcrev()
4955e7bf085c subrepo/svn: cache _wcrev() value in merge()
Patrick Mezard <patrick@mezard.eu>
parents: 16554
diff changeset
  1281
        if new != wcrev:
4955e7bf085c subrepo/svn: cache _wcrev() value in merge()
Patrick Mezard <patrick@mezard.eu>
parents: 16554
diff changeset
  1282
            dirty = old == wcrev or self._wcchanged()[0]
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1283
            if _updateprompt(self.ui, self, dirty, wcrev, new):
13417
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1284
                self.get(state, False)
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1285
15708
309e49491253 push: propagate --new-branch and --ssh options when pushing subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 15614
diff changeset
  1286
    def push(self, opts):
11455
3827728b54e2 subrepo: fix silent push failure for SVN (issue2241)
Matt Mackall <mpm@selenic.com>
parents: 11117
diff changeset
  1287
        # push is a no-op for SVN
3827728b54e2 subrepo: fix silent push failure for SVN (issue2241)
Matt Mackall <mpm@selenic.com>
parents: 11117
diff changeset
  1288
        return True
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1289
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
  1290
    @annotatesubrepoerror
12322
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
  1291
    def files(self):
16450
c9c8c9053119 archive: make it work with svn subrepos (issue3308)
Patrick Mezard <patrick@mezard.eu>
parents: 16196
diff changeset
  1292
        output = self._svncommand(['list', '--recursive', '--xml'])[0]
c9c8c9053119 archive: make it work with svn subrepos (issue3308)
Patrick Mezard <patrick@mezard.eu>
parents: 16196
diff changeset
  1293
        doc = xml.dom.minidom.parseString(output)
c9c8c9053119 archive: make it work with svn subrepos (issue3308)
Patrick Mezard <patrick@mezard.eu>
parents: 16196
diff changeset
  1294
        paths = []
c9c8c9053119 archive: make it work with svn subrepos (issue3308)
Patrick Mezard <patrick@mezard.eu>
parents: 16196
diff changeset
  1295
        for e in doc.getElementsByTagName('entry'):
c9c8c9053119 archive: make it work with svn subrepos (issue3308)
Patrick Mezard <patrick@mezard.eu>
parents: 16196
diff changeset
  1296
            kind = str(e.getAttribute('kind'))
c9c8c9053119 archive: make it work with svn subrepos (issue3308)
Patrick Mezard <patrick@mezard.eu>
parents: 16196
diff changeset
  1297
            if kind != 'file':
c9c8c9053119 archive: make it work with svn subrepos (issue3308)
Patrick Mezard <patrick@mezard.eu>
parents: 16196
diff changeset
  1298
                continue
c9c8c9053119 archive: make it work with svn subrepos (issue3308)
Patrick Mezard <patrick@mezard.eu>
parents: 16196
diff changeset
  1299
            name = ''.join(c.data for c
c9c8c9053119 archive: make it work with svn subrepos (issue3308)
Patrick Mezard <patrick@mezard.eu>
parents: 16196
diff changeset
  1300
                           in e.getElementsByTagName('name')[0].childNodes
c9c8c9053119 archive: make it work with svn subrepos (issue3308)
Patrick Mezard <patrick@mezard.eu>
parents: 16196
diff changeset
  1301
                           if c.nodeType == c.TEXT_NODE)
17441
cb12d3ce5607 subrepo: encode unicode path names (issue3610)
Bryan O'Sullivan <bryano@fb.com>
parents: 17191
diff changeset
  1302
            paths.append(name.encode('utf-8'))
16450
c9c8c9053119 archive: make it work with svn subrepos (issue3308)
Patrick Mezard <patrick@mezard.eu>
parents: 16196
diff changeset
  1303
        return paths
12322
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
  1304
31099
b44ab288358e subrepo: run the repo decoders when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 30755
diff changeset
  1305
    def filedata(self, name, decode):
16450
c9c8c9053119 archive: make it work with svn subrepos (issue3308)
Patrick Mezard <patrick@mezard.eu>
parents: 16196
diff changeset
  1306
        return self._svncommand(['cat'], name)[0]
12322
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
  1307
510afb31cf99 subrepo: introduce files and filedata methods for subrepo classes
Martin Geisler <mg@aragost.com>
parents: 12274
diff changeset
  1308
13106
c869bd9e1193 subrepo: gitsubrepo should inherit from abstractsubrepo
Eric Eisner <ede@mit.edu>
parents: 13097
diff changeset
  1309
class gitsubrepo(abstractsubrepo):
29021
92d37fb3f1aa verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28949
diff changeset
  1310
    def __init__(self, ctx, path, state, allowcreate):
24671
98ab035e9332 subrepo: change arguments of abstractsubrepo.__init__ (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24645
diff changeset
  1311
        super(gitsubrepo, self).__init__(ctx, path)
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1312
        self._state = state
24302
6e092ea2eff1 subrepo: replace 'ctx._repo' with 'ctx.repo()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24256
diff changeset
  1313
        self._abspath = ctx.repo().wjoin(path)
6e092ea2eff1 subrepo: replace 'ctx._repo' with 'ctx.repo()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24256
diff changeset
  1314
        self._subparent = ctx.repo()
17024
33b057778cd2 subrepo: warn user if Git is not version 1.6.0 or higher
Benjamin Pollack <benjamin@bitquabit.com>
parents: 16596
diff changeset
  1315
        self._ensuregit()
33b057778cd2 subrepo: warn user if Git is not version 1.6.0 or higher
Benjamin Pollack <benjamin@bitquabit.com>
parents: 16596
diff changeset
  1316
33b057778cd2 subrepo: warn user if Git is not version 1.6.0 or higher
Benjamin Pollack <benjamin@bitquabit.com>
parents: 16596
diff changeset
  1317
    def _ensuregit(self):
17025
8ad08dcab7d9 subrepo: support Git being named "git.cmd" on Windows (issue3173)
Benjamin Pollack <benjamin@bitquabit.com>
parents: 17024
diff changeset
  1318
        try:
8ad08dcab7d9 subrepo: support Git being named "git.cmd" on Windows (issue3173)
Benjamin Pollack <benjamin@bitquabit.com>
parents: 17024
diff changeset
  1319
            self._gitexecutable = 'git'
8ad08dcab7d9 subrepo: support Git being named "git.cmd" on Windows (issue3173)
Benjamin Pollack <benjamin@bitquabit.com>
parents: 17024
diff changeset
  1320
            out, err = self._gitnodir(['--version'])
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
  1321
        except OSError as e:
27935
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1322
            genericerror = _("error executing git for subrepo '%s': %s")
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1323
            notfoundhint = _("check git is installed and in your PATH")
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1324
            if e.errno != errno.ENOENT:
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1325
                raise error.Abort(genericerror % (self._path, e.strerror))
30639
d524c88511a7 py3: replace os.name with pycompat.osname (part 1 of 2)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30635
diff changeset
  1326
            elif pycompat.osname == 'nt':
27935
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1327
                try:
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1328
                    self._gitexecutable = 'git.cmd'
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1329
                    out, err = self._gitnodir(['--version'])
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1330
                except OSError as e2:
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1331
                    if e2.errno == errno.ENOENT:
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1332
                        raise error.Abort(_("couldn't find 'git' or 'git.cmd'"
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1333
                            " for subrepo '%s'") % self._path,
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1334
                            hint=notfoundhint)
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1335
                    else:
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1336
                        raise error.Abort(genericerror % (self._path,
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1337
                            e2.strerror))
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1338
            else:
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1339
                raise error.Abort(_("couldn't find git for subrepo '%s'")
594bdc380aa2 subrepo: better error messages in _ensuregit
Mason Malone <mason.malone@gmail.com>
parents: 27844
diff changeset
  1340
                    % self._path, hint=notfoundhint)
20840
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1341
        versionstatus = self._checkversion(out)
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1342
        if versionstatus == 'unknown':
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1343
            self.ui.warn(_('cannot retrieve git version\n'))
20840
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1344
        elif versionstatus == 'abort':
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
  1345
            raise error.Abort(_('git subrepo requires at least 1.6.0 or later'))
20840
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1346
        elif versionstatus == 'warning':
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1347
            self.ui.warn(_('git subrepo requires at least 1.6.0 or later\n'))
20840
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1348
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1349
    @staticmethod
23521
f5de2a82b77e subrepo: move git version check into a separate method
Mathias De Maré <mathias.demare@gmail.com>
parents: 23411
diff changeset
  1350
    def _gitversion(out):
23522
49a58b33d1ce subrepo: extend git version check to 3 digits
Mathias De Maré <mathias.demare@gmail.com>
parents: 23521
diff changeset
  1351
        m = re.search(r'^git version (\d+)\.(\d+)\.(\d+)', out)
49a58b33d1ce subrepo: extend git version check to 3 digits
Mathias De Maré <mathias.demare@gmail.com>
parents: 23521
diff changeset
  1352
        if m:
49a58b33d1ce subrepo: extend git version check to 3 digits
Mathias De Maré <mathias.demare@gmail.com>
parents: 23521
diff changeset
  1353
            return (int(m.group(1)), int(m.group(2)), int(m.group(3)))
49a58b33d1ce subrepo: extend git version check to 3 digits
Mathias De Maré <mathias.demare@gmail.com>
parents: 23521
diff changeset
  1354
23521
f5de2a82b77e subrepo: move git version check into a separate method
Mathias De Maré <mathias.demare@gmail.com>
parents: 23411
diff changeset
  1355
        m = re.search(r'^git version (\d+)\.(\d+)', out)
f5de2a82b77e subrepo: move git version check into a separate method
Mathias De Maré <mathias.demare@gmail.com>
parents: 23411
diff changeset
  1356
        if m:
23522
49a58b33d1ce subrepo: extend git version check to 3 digits
Mathias De Maré <mathias.demare@gmail.com>
parents: 23521
diff changeset
  1357
            return (int(m.group(1)), int(m.group(2)), 0)
23521
f5de2a82b77e subrepo: move git version check into a separate method
Mathias De Maré <mathias.demare@gmail.com>
parents: 23411
diff changeset
  1358
f5de2a82b77e subrepo: move git version check into a separate method
Mathias De Maré <mathias.demare@gmail.com>
parents: 23411
diff changeset
  1359
        return -1
f5de2a82b77e subrepo: move git version check into a separate method
Mathias De Maré <mathias.demare@gmail.com>
parents: 23411
diff changeset
  1360
f5de2a82b77e subrepo: move git version check into a separate method
Mathias De Maré <mathias.demare@gmail.com>
parents: 23411
diff changeset
  1361
    @staticmethod
20840
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1362
    def _checkversion(out):
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1363
        '''ensure git version is new enough
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1364
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1365
        >>> _checkversion = gitsubrepo._checkversion
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1366
        >>> _checkversion('git version 1.6.0')
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1367
        'ok'
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1368
        >>> _checkversion('git version 1.8.5')
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1369
        'ok'
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1370
        >>> _checkversion('git version 1.4.0')
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1371
        'abort'
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1372
        >>> _checkversion('git version 1.5.0')
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1373
        'warning'
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1374
        >>> _checkversion('git version 1.9-rc0')
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1375
        'ok'
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1376
        >>> _checkversion('git version 1.9.0.265.g81cdec2')
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1377
        'ok'
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1378
        >>> _checkversion('git version 1.9.0.GIT')
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1379
        'ok'
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1380
        >>> _checkversion('git version 12345')
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1381
        'unknown'
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1382
        >>> _checkversion('no')
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1383
        'unknown'
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1384
        '''
23521
f5de2a82b77e subrepo: move git version check into a separate method
Mathias De Maré <mathias.demare@gmail.com>
parents: 23411
diff changeset
  1385
        version = gitsubrepo._gitversion(out)
17024
33b057778cd2 subrepo: warn user if Git is not version 1.6.0 or higher
Benjamin Pollack <benjamin@bitquabit.com>
parents: 16596
diff changeset
  1386
        # git 1.4.0 can't work at all, but 1.5.X can in at least some cases,
33b057778cd2 subrepo: warn user if Git is not version 1.6.0 or higher
Benjamin Pollack <benjamin@bitquabit.com>
parents: 16596
diff changeset
  1387
        # despite the docstring comment.  For now, error on 1.4.0, warn on
33b057778cd2 subrepo: warn user if Git is not version 1.6.0 or higher
Benjamin Pollack <benjamin@bitquabit.com>
parents: 16596
diff changeset
  1388
        # 1.5.0 but attempt to continue.
23521
f5de2a82b77e subrepo: move git version check into a separate method
Mathias De Maré <mathias.demare@gmail.com>
parents: 23411
diff changeset
  1389
        if version == -1:
f5de2a82b77e subrepo: move git version check into a separate method
Mathias De Maré <mathias.demare@gmail.com>
parents: 23411
diff changeset
  1390
            return 'unknown'
23522
49a58b33d1ce subrepo: extend git version check to 3 digits
Mathias De Maré <mathias.demare@gmail.com>
parents: 23521
diff changeset
  1391
        if version < (1, 5, 0):
20840
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1392
            return 'abort'
23522
49a58b33d1ce subrepo: extend git version check to 3 digits
Mathias De Maré <mathias.demare@gmail.com>
parents: 23521
diff changeset
  1393
        elif version < (1, 6, 0):
20840
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1394
            return 'warning'
308344d80fe5 subrepo: factor out Git version check to add doctests
Siddharth Agarwal <sid0@fb.com>
parents: 20818
diff changeset
  1395
        return 'ok'
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1396
13095
49c7e875482d subrepo: use environment variable instead of git commit's --date
Eric Eisner <ede@mit.edu>
parents: 13094
diff changeset
  1397
    def _gitcommand(self, commands, env=None, stream=False):
49c7e875482d subrepo: use environment variable instead of git commit's --date
Eric Eisner <ede@mit.edu>
parents: 13094
diff changeset
  1398
        return self._gitdir(commands, env=env, stream=stream)[0]
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1399
13095
49c7e875482d subrepo: use environment variable instead of git commit's --date
Eric Eisner <ede@mit.edu>
parents: 13094
diff changeset
  1400
    def _gitdir(self, commands, env=None, stream=False):
13181
413bef846806 subrepo: fix subrelpath for git subrepos
Eric Eisner <ede@mit.edu>
parents: 13180
diff changeset
  1401
        return self._gitnodir(commands, env=env, stream=stream,
413bef846806 subrepo: fix subrelpath for git subrepos
Eric Eisner <ede@mit.edu>
parents: 13180
diff changeset
  1402
                              cwd=self._abspath)
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1403
13095
49c7e875482d subrepo: use environment variable instead of git commit's --date
Eric Eisner <ede@mit.edu>
parents: 13094
diff changeset
  1404
    def _gitnodir(self, commands, env=None, stream=False, cwd=None):
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1405
        """Calls the git command
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1406
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 17191
diff changeset
  1407
        The methods tries to call the git command. versions prior to 1.6.0
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1408
        are not supported and very probably fail.
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1409
        """
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1410
        self.ui.debug('%s: git %s\n' % (self._relpath, ' '.join(commands)))
28658
34d43cb85de8 subrepo: set GIT_ALLOW_PROTOCOL to limit git clone protocols (SEC)
Mateusz Kwapich <mitrandir@fb.com>
parents: 28618
diff changeset
  1411
        if env is None:
30635
a150173da1c1 py3: replace os.environ with encoding.environ (part 2 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30615
diff changeset
  1412
            env = encoding.environ.copy()
28949
9d3e280864fb subrepo: disable localizations when calling Git (issue5176)
Matt Mackall <mpm@selenic.com>
parents: 28670
diff changeset
  1413
        # disable localization for Git output (issue5176)
9d3e280864fb subrepo: disable localizations when calling Git (issue5176)
Matt Mackall <mpm@selenic.com>
parents: 28670
diff changeset
  1414
        env['LC_ALL'] = 'C'
28658
34d43cb85de8 subrepo: set GIT_ALLOW_PROTOCOL to limit git clone protocols (SEC)
Mateusz Kwapich <mitrandir@fb.com>
parents: 28618
diff changeset
  1415
        # fix for Git CVE-2015-7545
34d43cb85de8 subrepo: set GIT_ALLOW_PROTOCOL to limit git clone protocols (SEC)
Mateusz Kwapich <mitrandir@fb.com>
parents: 28618
diff changeset
  1416
        if 'GIT_ALLOW_PROTOCOL' not in env:
34d43cb85de8 subrepo: set GIT_ALLOW_PROTOCOL to limit git clone protocols (SEC)
Mateusz Kwapich <mitrandir@fb.com>
parents: 28618
diff changeset
  1417
            env['GIT_ALLOW_PROTOCOL'] = 'file:git:http:https:ssh'
13111
560b8001f765 subrepo: silence git output when ui.quiet is set
Eric Eisner <ede@mit.edu>
parents: 13110
diff changeset
  1418
        # unless ui.quiet is set, print git's stderr,
560b8001f765 subrepo: silence git output when ui.quiet is set
Eric Eisner <ede@mit.edu>
parents: 13110
diff changeset
  1419
        # which is mostly progress and useful info
560b8001f765 subrepo: silence git output when ui.quiet is set
Eric Eisner <ede@mit.edu>
parents: 13110
diff changeset
  1420
        errpipe = None
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1421
        if self.ui.quiet:
13111
560b8001f765 subrepo: silence git output when ui.quiet is set
Eric Eisner <ede@mit.edu>
parents: 13110
diff changeset
  1422
            errpipe = open(os.devnull, 'w')
31102
96d561c90ad0 color: move git-subrepo support into the subrepo module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31099
diff changeset
  1423
        if self.ui._colormode and len(commands) and commands[0] == "diff":
96d561c90ad0 color: move git-subrepo support into the subrepo module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31099
diff changeset
  1424
            # insert the argument in the front,
96d561c90ad0 color: move git-subrepo support into the subrepo module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31099
diff changeset
  1425
            # the end of git diff arguments is used for paths
96d561c90ad0 color: move git-subrepo support into the subrepo module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31099
diff changeset
  1426
            commands.insert(1, '--color')
17025
8ad08dcab7d9 subrepo: support Git being named "git.cmd" on Windows (issue3173)
Benjamin Pollack <benjamin@bitquabit.com>
parents: 17024
diff changeset
  1427
        p = subprocess.Popen([self._gitexecutable] + commands, bufsize=-1,
8ad08dcab7d9 subrepo: support Git being named "git.cmd" on Windows (issue3173)
Benjamin Pollack <benjamin@bitquabit.com>
parents: 17024
diff changeset
  1428
                             cwd=cwd, env=env, close_fds=util.closefds,
13111
560b8001f765 subrepo: silence git output when ui.quiet is set
Eric Eisner <ede@mit.edu>
parents: 13110
diff changeset
  1429
                             stdout=subprocess.PIPE, stderr=errpipe)
13027
7f2ecb64140d subrepo: archive git subrepos
Eric Eisner <ede@mit.edu>
parents: 13018
diff changeset
  1430
        if stream:
7f2ecb64140d subrepo: archive git subrepos
Eric Eisner <ede@mit.edu>
parents: 13018
diff changeset
  1431
            return p.stdout, None
7f2ecb64140d subrepo: archive git subrepos
Eric Eisner <ede@mit.edu>
parents: 13018
diff changeset
  1432
13085
b4814f1f415c subrepo: strip gitcommand output
Eric Eisner <ede@mit.edu>
parents: 13029
diff changeset
  1433
        retdata = p.stdout.read().strip()
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1434
        # wait for the child to exit to avoid race condition.
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1435
        p.wait()
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1436
13107
3bc237b0eaea subrepo: treat git error code 1 as success
Eric Eisner <ede@mit.edu>
parents: 13106
diff changeset
  1437
        if p.returncode != 0 and p.returncode != 1:
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1438
            # there are certain error codes that are ok
13110
cad35f06c031 subrepo: show git command with --debug
Eric Eisner <ede@mit.edu>
parents: 13109
diff changeset
  1439
            command = commands[0]
13150
8617b8b74fae subrepo: use low-level git-for-each-ref command in branchmap
Eric Eisner <ede@mit.edu>
parents: 13144
diff changeset
  1440
            if command in ('cat-file', 'symbolic-ref'):
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1441
                return retdata, p.returncode
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1442
            # for all others, abort
29389
98e8313dcd9e i18n: translate abort messages
liscju <piotr.listkiewicz@gmail.com>
parents: 29341
diff changeset
  1443
            raise error.Abort(_('git %s error %d in %s') %
13110
cad35f06c031 subrepo: show git command with --debug
Eric Eisner <ede@mit.edu>
parents: 13109
diff changeset
  1444
                             (command, p.returncode, self._relpath))
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1445
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1446
        return retdata, p.returncode
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1447
13553
dea6efdd7ec4 subrepo: don't crash when git repo is missing
Eric Eisner <ede@mit.edu>
parents: 13531
diff changeset
  1448
    def _gitmissing(self):
24695
419528cb05b6 subrepo: convert the os.path references in git to vfs
Matt Harbison <matt_harbison@yahoo.com>
parents: 24694
diff changeset
  1449
        return not self.wvfs.exists('.git')
13553
dea6efdd7ec4 subrepo: don't crash when git repo is missing
Eric Eisner <ede@mit.edu>
parents: 13531
diff changeset
  1450
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1451
    def _gitstate(self):
13085
b4814f1f415c subrepo: strip gitcommand output
Eric Eisner <ede@mit.edu>
parents: 13029
diff changeset
  1452
        return self._gitcommand(['rev-parse', 'HEAD'])
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1453
13152
70d80907e4b8 subrepo: defer determination of git's current branch
Eric Eisner <ede@mit.edu>
parents: 13151
diff changeset
  1454
    def _gitcurrentbranch(self):
70d80907e4b8 subrepo: defer determination of git's current branch
Eric Eisner <ede@mit.edu>
parents: 13151
diff changeset
  1455
        current, err = self._gitdir(['symbolic-ref', 'HEAD', '--quiet'])
70d80907e4b8 subrepo: defer determination of git's current branch
Eric Eisner <ede@mit.edu>
parents: 13151
diff changeset
  1456
        if err:
70d80907e4b8 subrepo: defer determination of git's current branch
Eric Eisner <ede@mit.edu>
parents: 13151
diff changeset
  1457
            current = None
70d80907e4b8 subrepo: defer determination of git's current branch
Eric Eisner <ede@mit.edu>
parents: 13151
diff changeset
  1458
        return current
70d80907e4b8 subrepo: defer determination of git's current branch
Eric Eisner <ede@mit.edu>
parents: 13151
diff changeset
  1459
13569
3ab3b892d223 subrepo: show the source that git pulls
Eric Eisner <ede@mit.edu>
parents: 13560
diff changeset
  1460
    def _gitremote(self, remote):
3ab3b892d223 subrepo: show the source that git pulls
Eric Eisner <ede@mit.edu>
parents: 13560
diff changeset
  1461
        out = self._gitcommand(['remote', 'show', '-n', remote])
3ab3b892d223 subrepo: show the source that git pulls
Eric Eisner <ede@mit.edu>
parents: 13560
diff changeset
  1462
        line = out.split('\n')[1]
3ab3b892d223 subrepo: show the source that git pulls
Eric Eisner <ede@mit.edu>
parents: 13560
diff changeset
  1463
        i = line.index('URL: ') + len('URL: ')
3ab3b892d223 subrepo: show the source that git pulls
Eric Eisner <ede@mit.edu>
parents: 13560
diff changeset
  1464
        return line[i:]
3ab3b892d223 subrepo: show the source that git pulls
Eric Eisner <ede@mit.edu>
parents: 13560
diff changeset
  1465
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1466
    def _githavelocally(self, revision):
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1467
        out, code = self._gitdir(['cat-file', '-e', revision])
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1468
        return code == 0
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1469
13029
f930032aa6d5 subrepo: lazier git push logic
Eric Eisner <ede@mit.edu>
parents: 13027
diff changeset
  1470
    def _gitisancestor(self, r1, r2):
13085
b4814f1f415c subrepo: strip gitcommand output
Eric Eisner <ede@mit.edu>
parents: 13029
diff changeset
  1471
        base = self._gitcommand(['merge-base', r1, r2])
13029
f930032aa6d5 subrepo: lazier git push logic
Eric Eisner <ede@mit.edu>
parents: 13027
diff changeset
  1472
        return base == r1
f930032aa6d5 subrepo: lazier git push logic
Eric Eisner <ede@mit.edu>
parents: 13027
diff changeset
  1473
14440
96f1c1b14154 subrepo: bare git repos considered dirty
Paul Molodowitch <pm@stanfordalumni.org>
parents: 14417
diff changeset
  1474
    def _gitisbare(self):
96f1c1b14154 subrepo: bare git repos considered dirty
Paul Molodowitch <pm@stanfordalumni.org>
parents: 14417
diff changeset
  1475
        return self._gitcommand(['config', '--bool', 'core.bare']) == 'true'
96f1c1b14154 subrepo: bare git repos considered dirty
Paul Molodowitch <pm@stanfordalumni.org>
parents: 14417
diff changeset
  1476
15531
0810ccc51f0a subrepo: fix git status false positive (issue3109)
Eric Roshan Eisner <ede@alum.mit.edu>
parents: 15498
diff changeset
  1477
    def _gitupdatestat(self):
0810ccc51f0a subrepo: fix git status false positive (issue3109)
Eric Roshan Eisner <ede@alum.mit.edu>
parents: 15498
diff changeset
  1478
        """This must be run before git diff-index.
0810ccc51f0a subrepo: fix git status false positive (issue3109)
Eric Roshan Eisner <ede@alum.mit.edu>
parents: 15498
diff changeset
  1479
        diff-index only looks at changes to file stat;
0810ccc51f0a subrepo: fix git status false positive (issue3109)
Eric Roshan Eisner <ede@alum.mit.edu>
parents: 15498
diff changeset
  1480
        this command looks at file contents and updates the stat."""
0810ccc51f0a subrepo: fix git status false positive (issue3109)
Eric Roshan Eisner <ede@alum.mit.edu>
parents: 15498
diff changeset
  1481
        self._gitcommand(['update-index', '-q', '--refresh'])
0810ccc51f0a subrepo: fix git status false positive (issue3109)
Eric Roshan Eisner <ede@alum.mit.edu>
parents: 15498
diff changeset
  1482
12995
d90fc91c8377 subrepo: update and merge works with any git branch
Eric Eisner <ede@mit.edu>
parents: 12994
diff changeset
  1483
    def _gitbranchmap(self):
13178
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1484
        '''returns 2 things:
13086
8db85e39d59c subrepo: return both mapping directions from gitbranchmap
Eric Eisner <ede@mit.edu>
parents: 13085
diff changeset
  1485
        a map from git branch to revision
13178
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1486
        a map from revision to branches'''
13086
8db85e39d59c subrepo: return both mapping directions from gitbranchmap
Eric Eisner <ede@mit.edu>
parents: 13085
diff changeset
  1487
        branch2rev = {}
8db85e39d59c subrepo: return both mapping directions from gitbranchmap
Eric Eisner <ede@mit.edu>
parents: 13085
diff changeset
  1488
        rev2branch = {}
13178
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1489
13150
8617b8b74fae subrepo: use low-level git-for-each-ref command in branchmap
Eric Eisner <ede@mit.edu>
parents: 13144
diff changeset
  1490
        out = self._gitcommand(['for-each-ref', '--format',
13178
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1491
                                '%(objectname) %(refname)'])
12995
d90fc91c8377 subrepo: update and merge works with any git branch
Eric Eisner <ede@mit.edu>
parents: 12994
diff changeset
  1492
        for line in out.split('\n'):
13178
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1493
            revision, ref = line.split(' ')
13465
fa88fabc1d66 subrepo: disallow all unknown git ref types
Eric Eisner <ede@mit.edu>
parents: 13460
diff changeset
  1494
            if (not ref.startswith('refs/heads/') and
fa88fabc1d66 subrepo: disallow all unknown git ref types
Eric Eisner <ede@mit.edu>
parents: 13460
diff changeset
  1495
                not ref.startswith('refs/remotes/')):
12995
d90fc91c8377 subrepo: update and merge works with any git branch
Eric Eisner <ede@mit.edu>
parents: 12994
diff changeset
  1496
                continue
13150
8617b8b74fae subrepo: use low-level git-for-each-ref command in branchmap
Eric Eisner <ede@mit.edu>
parents: 13144
diff changeset
  1497
            if ref.startswith('refs/remotes/') and ref.endswith('/HEAD'):
12995
d90fc91c8377 subrepo: update and merge works with any git branch
Eric Eisner <ede@mit.edu>
parents: 12994
diff changeset
  1498
                continue # ignore remote/HEAD redirects
13150
8617b8b74fae subrepo: use low-level git-for-each-ref command in branchmap
Eric Eisner <ede@mit.edu>
parents: 13144
diff changeset
  1499
            branch2rev[ref] = revision
8617b8b74fae subrepo: use low-level git-for-each-ref command in branchmap
Eric Eisner <ede@mit.edu>
parents: 13144
diff changeset
  1500
            rev2branch.setdefault(revision, []).append(ref)
13178
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1501
        return branch2rev, rev2branch
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1502
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1503
    def _gittracking(self, branches):
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1504
        'return map of remote branch to local tracking branch'
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1505
        # assumes no more than one local tracking branch for each remote
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1506
        tracking = {}
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1507
        for b in branches:
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1508
            if b.startswith('refs/remotes/'):
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1509
                continue
15234
5d700b7edd85 subrepo: fix git branch tracking logic (issue2920)
Eric Roshan Eisner <ede@alum.mit.edu>
parents: 15208
diff changeset
  1510
            bname = b.split('/', 2)[2]
5d700b7edd85 subrepo: fix git branch tracking logic (issue2920)
Eric Roshan Eisner <ede@alum.mit.edu>
parents: 15208
diff changeset
  1511
            remote = self._gitcommand(['config', 'branch.%s.remote' % bname])
13178
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1512
            if remote:
15234
5d700b7edd85 subrepo: fix git branch tracking logic (issue2920)
Eric Roshan Eisner <ede@alum.mit.edu>
parents: 15208
diff changeset
  1513
                ref = self._gitcommand(['config', 'branch.%s.merge' % bname])
13178
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1514
                tracking['refs/remotes/%s/%s' %
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1515
                         (remote, ref.split('/', 2)[2])] = b
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1516
        return tracking
13087
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1517
13460
64bb8e586a92 subrepo: expand relative sources for git subrepos
Eric Eisner <ede@mit.edu>
parents: 13432
diff changeset
  1518
    def _abssource(self, source):
13692
a7c9735307bd subrepo: recognize scp-style paths as git URLs
Eric Eisner <ede@mit.edu>
parents: 13559
diff changeset
  1519
        if '://' not in source:
a7c9735307bd subrepo: recognize scp-style paths as git URLs
Eric Eisner <ede@mit.edu>
parents: 13559
diff changeset
  1520
            # recognize the scp syntax as an absolute source
a7c9735307bd subrepo: recognize scp-style paths as git URLs
Eric Eisner <ede@mit.edu>
parents: 13559
diff changeset
  1521
            colon = source.find(':')
a7c9735307bd subrepo: recognize scp-style paths as git URLs
Eric Eisner <ede@mit.edu>
parents: 13559
diff changeset
  1522
            if colon != -1 and '/' not in source[:colon]:
a7c9735307bd subrepo: recognize scp-style paths as git URLs
Eric Eisner <ede@mit.edu>
parents: 13559
diff changeset
  1523
                return source
13460
64bb8e586a92 subrepo: expand relative sources for git subrepos
Eric Eisner <ede@mit.edu>
parents: 13432
diff changeset
  1524
        self._subsource = source
64bb8e586a92 subrepo: expand relative sources for git subrepos
Eric Eisner <ede@mit.edu>
parents: 13432
diff changeset
  1525
        return _abssource(self)
64bb8e586a92 subrepo: expand relative sources for git subrepos
Eric Eisner <ede@mit.edu>
parents: 13432
diff changeset
  1526
12993
a91334380699 subrepo: cloning and updating of git subrepos
Eric Eisner <ede@mit.edu>
parents: 12992
diff changeset
  1527
    def _fetch(self, source, revision):
13553
dea6efdd7ec4 subrepo: don't crash when git repo is missing
Eric Eisner <ede@mit.edu>
parents: 13531
diff changeset
  1528
        if self._gitmissing():
13525
c12088259f64 subrepo: show the source that git clones
Eric Eisner <ede@mit.edu>
parents: 13466
diff changeset
  1529
            source = self._abssource(source)
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1530
            self.ui.status(_('cloning subrepo %s from %s\n') %
13525
c12088259f64 subrepo: show the source that git clones
Eric Eisner <ede@mit.edu>
parents: 13466
diff changeset
  1531
                            (self._relpath, source))
c12088259f64 subrepo: show the source that git clones
Eric Eisner <ede@mit.edu>
parents: 13466
diff changeset
  1532
            self._gitnodir(['clone', source, self._abspath])
12993
a91334380699 subrepo: cloning and updating of git subrepos
Eric Eisner <ede@mit.edu>
parents: 12992
diff changeset
  1533
        if self._githavelocally(revision):
a91334380699 subrepo: cloning and updating of git subrepos
Eric Eisner <ede@mit.edu>
parents: 12992
diff changeset
  1534
            return
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1535
        self.ui.status(_('pulling subrepo %s from %s\n') %
13569
3ab3b892d223 subrepo: show the source that git pulls
Eric Eisner <ede@mit.edu>
parents: 13560
diff changeset
  1536
                        (self._relpath, self._gitremote('origin')))
13466
f2295f7cd468 subrepo: only attempt pulling from git's origin
Eric Eisner <ede@mit.edu>
parents: 13465
diff changeset
  1537
        # try only origin: the originally cloned repo
13097
c922aacf6f1f subrepo: drop arguments unsupported by old git
Eric Eisner <ede@mit.edu>
parents: 13096
diff changeset
  1538
        self._gitcommand(['fetch'])
12993
a91334380699 subrepo: cloning and updating of git subrepos
Eric Eisner <ede@mit.edu>
parents: 12992
diff changeset
  1539
        if not self._githavelocally(revision):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
  1540
            raise error.Abort(_("revision %s does not exist in subrepo %s\n") %
13181
413bef846806 subrepo: fix subrelpath for git subrepos
Eric Eisner <ede@mit.edu>
parents: 13180
diff changeset
  1541
                               (revision, self._relpath))
12993
a91334380699 subrepo: cloning and updating of git subrepos
Eric Eisner <ede@mit.edu>
parents: 12992
diff changeset
  1542
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
  1543
    @annotatesubrepoerror
13179
b512a7074349 subrepo: support ignoreupdate in gitsubrepo's dirty()
Eric Eisner <ede@mit.edu>
parents: 13178
diff changeset
  1544
    def dirty(self, ignoreupdate=False):
13553
dea6efdd7ec4 subrepo: don't crash when git repo is missing
Eric Eisner <ede@mit.edu>
parents: 13531
diff changeset
  1545
        if self._gitmissing():
14469
2fdea636f254 subrepo: don't crash when git .hgsubstate is empty (issue2716)
Eric Eisner <ede@alum.mit.edu>
parents: 14205
diff changeset
  1546
            return self._state[1] != ''
14440
96f1c1b14154 subrepo: bare git repos considered dirty
Paul Molodowitch <pm@stanfordalumni.org>
parents: 14417
diff changeset
  1547
        if self._gitisbare():
96f1c1b14154 subrepo: bare git repos considered dirty
Paul Molodowitch <pm@stanfordalumni.org>
parents: 14417
diff changeset
  1548
            return True
13179
b512a7074349 subrepo: support ignoreupdate in gitsubrepo's dirty()
Eric Eisner <ede@mit.edu>
parents: 13178
diff changeset
  1549
        if not ignoreupdate and self._state[1] != self._gitstate():
13325
7ebdfa37842e subrepo: clarify comments in dirty() methods
Kevin Bullock <kbullock@ringworld.org>
parents: 13324
diff changeset
  1550
            # different version checked out
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1551
            return True
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1552
        # check for staged changes or modified files; ignore untracked files
15531
0810ccc51f0a subrepo: fix git status false positive (issue3109)
Eric Roshan Eisner <ede@alum.mit.edu>
parents: 15498
diff changeset
  1553
        self._gitupdatestat()
13153
dca5488f0e4f subrepo: use low-level git-diff-index for dirty()
Eric Eisner <ede@mit.edu>
parents: 13152
diff changeset
  1554
        out, code = self._gitdir(['diff-index', '--quiet', 'HEAD'])
dca5488f0e4f subrepo: use low-level git-diff-index for dirty()
Eric Eisner <ede@mit.edu>
parents: 13152
diff changeset
  1555
        return code == 1
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1556
16072
bcb973abcc0b subrepo: add basestate method
Matt Mackall <mpm@selenic.com>
parents: 16022
diff changeset
  1557
    def basestate(self):
bcb973abcc0b subrepo: add basestate method
Matt Mackall <mpm@selenic.com>
parents: 16022
diff changeset
  1558
        return self._gitstate()
bcb973abcc0b subrepo: add basestate method
Matt Mackall <mpm@selenic.com>
parents: 16022
diff changeset
  1559
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
  1560
    @annotatesubrepoerror
13323
d8d478f9ee0f merge with stable
Martin Geisler <mg@aragost.com>
parents: 13288 13322
diff changeset
  1561
    def get(self, state, overwrite=False):
12993
a91334380699 subrepo: cloning and updating of git subrepos
Eric Eisner <ede@mit.edu>
parents: 12992
diff changeset
  1562
        source, revision, kind = state
14469
2fdea636f254 subrepo: don't crash when git .hgsubstate is empty (issue2716)
Eric Eisner <ede@alum.mit.edu>
parents: 14205
diff changeset
  1563
        if not revision:
2fdea636f254 subrepo: don't crash when git .hgsubstate is empty (issue2716)
Eric Eisner <ede@alum.mit.edu>
parents: 14205
diff changeset
  1564
            self.remove()
2fdea636f254 subrepo: don't crash when git .hgsubstate is empty (issue2716)
Eric Eisner <ede@alum.mit.edu>
parents: 14205
diff changeset
  1565
            return
12993
a91334380699 subrepo: cloning and updating of git subrepos
Eric Eisner <ede@mit.edu>
parents: 12992
diff changeset
  1566
        self._fetch(source, revision)
12996
3a42651b0a62 subrepo: removing (and restoring) git subrepo state
Eric Eisner <ede@mit.edu>
parents: 12995
diff changeset
  1567
        # if the repo was set to be bare, unbare it
14440
96f1c1b14154 subrepo: bare git repos considered dirty
Paul Molodowitch <pm@stanfordalumni.org>
parents: 14417
diff changeset
  1568
        if self._gitisbare():
12996
3a42651b0a62 subrepo: removing (and restoring) git subrepo state
Eric Eisner <ede@mit.edu>
parents: 12995
diff changeset
  1569
            self._gitcommand(['config', 'core.bare', 'false'])
3a42651b0a62 subrepo: removing (and restoring) git subrepo state
Eric Eisner <ede@mit.edu>
parents: 12995
diff changeset
  1570
            if self._gitstate() == revision:
3a42651b0a62 subrepo: removing (and restoring) git subrepo state
Eric Eisner <ede@mit.edu>
parents: 12995
diff changeset
  1571
                self._gitcommand(['reset', '--hard', 'HEAD'])
3a42651b0a62 subrepo: removing (and restoring) git subrepo state
Eric Eisner <ede@mit.edu>
parents: 12995
diff changeset
  1572
                return
3a42651b0a62 subrepo: removing (and restoring) git subrepo state
Eric Eisner <ede@mit.edu>
parents: 12995
diff changeset
  1573
        elif self._gitstate() == revision:
13324
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1574
            if overwrite:
13927
518344d02761 subrepo: trailing whitespace cleanup
Augie Fackler <durin42@gmail.com>
parents: 13913
diff changeset
  1575
                # first reset the index to unmark new files for commit, because
13324
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1576
                # reset --hard will otherwise throw away files added for commit,
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1577
                # not just unmark them.
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1578
                self._gitcommand(['reset', 'HEAD'])
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1579
                self._gitcommand(['reset', '--hard', 'HEAD'])
12995
d90fc91c8377 subrepo: update and merge works with any git branch
Eric Eisner <ede@mit.edu>
parents: 12994
diff changeset
  1580
            return
13178
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1581
        branch2rev, rev2branch = self._gitbranchmap()
13087
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1582
13324
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1583
        def checkout(args):
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1584
            cmd = ['checkout']
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1585
            if overwrite:
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1586
                # first reset the index to unmark new files for commit, because
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1587
                # the -f option will otherwise throw away files added for
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1588
                # commit, not just unmark them.
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1589
                self._gitcommand(['reset', 'HEAD'])
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1590
                cmd.append('-f')
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1591
            self._gitcommand(cmd + args)
24724
95eb067b2b5e subrepo: pass wvfs to _sanitize instead of absolute path to a subrepository
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24695
diff changeset
  1592
            _sanitize(self.ui, self.wvfs, '.git')
13324
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1593
13087
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1594
        def rawcheckout():
12995
d90fc91c8377 subrepo: update and merge works with any git branch
Eric Eisner <ede@mit.edu>
parents: 12994
diff changeset
  1595
            # no branch to checkout, check it out with no branch
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1596
            self.ui.warn(_('checking out detached HEAD in subrepo %s\n') %
12993
a91334380699 subrepo: cloning and updating of git subrepos
Eric Eisner <ede@mit.edu>
parents: 12992
diff changeset
  1597
                          self._relpath)
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1598
            self.ui.warn(_('check out a git branch if you intend '
12993
a91334380699 subrepo: cloning and updating of git subrepos
Eric Eisner <ede@mit.edu>
parents: 12992
diff changeset
  1599
                            'to make changes\n'))
13324
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1600
            checkout(['-q', revision])
13087
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1601
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1602
        if revision not in rev2branch:
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1603
            rawcheckout()
12995
d90fc91c8377 subrepo: update and merge works with any git branch
Eric Eisner <ede@mit.edu>
parents: 12994
diff changeset
  1604
            return
13086
8db85e39d59c subrepo: return both mapping directions from gitbranchmap
Eric Eisner <ede@mit.edu>
parents: 13085
diff changeset
  1605
        branches = rev2branch[revision]
12995
d90fc91c8377 subrepo: update and merge works with any git branch
Eric Eisner <ede@mit.edu>
parents: 12994
diff changeset
  1606
        firstlocalbranch = None
d90fc91c8377 subrepo: update and merge works with any git branch
Eric Eisner <ede@mit.edu>
parents: 12994
diff changeset
  1607
        for b in branches:
13150
8617b8b74fae subrepo: use low-level git-for-each-ref command in branchmap
Eric Eisner <ede@mit.edu>
parents: 13144
diff changeset
  1608
            if b == 'refs/heads/master':
12995
d90fc91c8377 subrepo: update and merge works with any git branch
Eric Eisner <ede@mit.edu>
parents: 12994
diff changeset
  1609
                # master trumps all other branches
13324
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1610
                checkout(['refs/heads/master'])
12995
d90fc91c8377 subrepo: update and merge works with any git branch
Eric Eisner <ede@mit.edu>
parents: 12994
diff changeset
  1611
                return
13150
8617b8b74fae subrepo: use low-level git-for-each-ref command in branchmap
Eric Eisner <ede@mit.edu>
parents: 13144
diff changeset
  1612
            if not firstlocalbranch and not b.startswith('refs/remotes/'):
12995
d90fc91c8377 subrepo: update and merge works with any git branch
Eric Eisner <ede@mit.edu>
parents: 12994
diff changeset
  1613
                firstlocalbranch = b
d90fc91c8377 subrepo: update and merge works with any git branch
Eric Eisner <ede@mit.edu>
parents: 12994
diff changeset
  1614
        if firstlocalbranch:
13324
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1615
            checkout([firstlocalbranch])
13087
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1616
            return
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1617
13178
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1618
        tracking = self._gittracking(branch2rev.keys())
13087
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1619
        # choose a remote branch already tracked if possible
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1620
        remote = branches[0]
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1621
        if remote not in tracking:
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1622
            for b in branches:
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1623
                if b in tracking:
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1624
                    remote = b
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1625
                    break
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1626
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1627
        if remote not in tracking:
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1628
            # create a new local tracking branch
19012
811e253226c3 subrepo: clone of git sub-repository creates incorrect git branch (issue3870)
pozheg <pozheg@gmail.com>
parents: 18967
diff changeset
  1629
            local = remote.split('/', 3)[3]
13324
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1630
            checkout(['-b', local, remote])
13087
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1631
        elif self._gitisancestor(branch2rev[tracking[remote]], remote):
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1632
            # When updating to a tracked remote branch,
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1633
            # if the local tracking branch is downstream of it,
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1634
            # a normal `git pull` would have performed a "fast-forward merge"
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1635
            # which is equivalent to updating the local branch to the remote.
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1636
            # Since we are only looking at branching at update, we need to
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1637
            # detect this situation and perform this action lazily.
13152
70d80907e4b8 subrepo: defer determination of git's current branch
Eric Eisner <ede@mit.edu>
parents: 13151
diff changeset
  1638
            if tracking[remote] != self._gitcurrentbranch():
13324
e5617047c926 subrepo: make update -C clean the working directory for git subrepos
Erik Zielke <ez@aragost.com>
parents: 13323
diff changeset
  1639
                checkout([tracking[remote]])
13087
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1640
            self._gitcommand(['merge', '--ff', remote])
24724
95eb067b2b5e subrepo: pass wvfs to _sanitize instead of absolute path to a subrepository
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24695
diff changeset
  1641
            _sanitize(self.ui, self.wvfs, '.git')
13087
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1642
        else:
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1643
            # a real merge would be required, just checkout the revision
cca0779b4832 subrepo: lazily update git's local tracking branches
Eric Eisner <ede@mit.edu>
parents: 13086
diff changeset
  1644
            rawcheckout()
12993
a91334380699 subrepo: cloning and updating of git subrepos
Eric Eisner <ede@mit.edu>
parents: 12992
diff changeset
  1645
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
  1646
    @annotatesubrepoerror
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1647
    def commit(self, text, user, date):
13553
dea6efdd7ec4 subrepo: don't crash when git repo is missing
Eric Eisner <ede@mit.edu>
parents: 13531
diff changeset
  1648
        if self._gitmissing():
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
  1649
            raise error.Abort(_("subrepo %s is missing") % self._relpath)
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1650
        cmd = ['commit', '-a', '-m', text]
30635
a150173da1c1 py3: replace os.environ with encoding.environ (part 2 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30615
diff changeset
  1651
        env = encoding.environ.copy()
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1652
        if user:
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1653
            cmd += ['--author', user]
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1654
        if date:
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1655
            # git's date parser silently ignores when seconds < 1e9
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1656
            # convert to ISO8601
13095
49c7e875482d subrepo: use environment variable instead of git commit's --date
Eric Eisner <ede@mit.edu>
parents: 13094
diff changeset
  1657
            env['GIT_AUTHOR_DATE'] = util.datestr(date,
49c7e875482d subrepo: use environment variable instead of git commit's --date
Eric Eisner <ede@mit.edu>
parents: 13094
diff changeset
  1658
                                                  '%Y-%m-%dT%H:%M:%S %1%2')
49c7e875482d subrepo: use environment variable instead of git commit's --date
Eric Eisner <ede@mit.edu>
parents: 13094
diff changeset
  1659
        self._gitcommand(cmd, env=env)
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1660
        # make sure commit works otherwise HEAD might not exist under certain
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1661
        # circumstances
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1662
        return self._gitstate()
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1663
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
  1664
    @annotatesubrepoerror
12994
845c602b8635 subrepo: allow git subrepos to push and merge
Eric Eisner <ede@mit.edu>
parents: 12993
diff changeset
  1665
    def merge(self, state):
845c602b8635 subrepo: allow git subrepos to push and merge
Eric Eisner <ede@mit.edu>
parents: 12993
diff changeset
  1666
        source, revision, kind = state
845c602b8635 subrepo: allow git subrepos to push and merge
Eric Eisner <ede@mit.edu>
parents: 12993
diff changeset
  1667
        self._fetch(source, revision)
13085
b4814f1f415c subrepo: strip gitcommand output
Eric Eisner <ede@mit.edu>
parents: 13029
diff changeset
  1668
        base = self._gitcommand(['merge-base', revision, self._state[1]])
15531
0810ccc51f0a subrepo: fix git status false positive (issue3109)
Eric Roshan Eisner <ede@alum.mit.edu>
parents: 15498
diff changeset
  1669
        self._gitupdatestat()
13417
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1670
        out, code = self._gitdir(['diff-index', '--quiet', 'HEAD'])
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1671
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1672
        def mergefunc():
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1673
            if base == revision:
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1674
                self.get(state) # fast forward merge
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1675
            elif base != self._state[1]:
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1676
                self._gitcommand(['merge', '--no-commit', revision])
24724
95eb067b2b5e subrepo: pass wvfs to _sanitize instead of absolute path to a subrepository
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24695
diff changeset
  1677
            _sanitize(self.ui, self.wvfs, '.git')
13417
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1678
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1679
        if self.dirty():
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1680
            if self._gitstate() != revision:
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1681
                dirty = self._gitstate() == self._state[1] or code != 0
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1682
                if _updateprompt(self.ui, self, dirty,
13432
5a5bd7614401 subrepo: break long line found by check-code
Martin Geisler <mg@aragost.com>
parents: 13428
diff changeset
  1683
                                 self._state[1][:7], revision[:7]):
13417
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1684
                    mergefunc()
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1685
        else:
0748e18be470 subrepos: prompt on conflicts on update with dirty subrepos
Erik Zielke <ez@aragost.com>
parents: 13413
diff changeset
  1686
            mergefunc()
12994
845c602b8635 subrepo: allow git subrepos to push and merge
Eric Eisner <ede@mit.edu>
parents: 12993
diff changeset
  1687
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
  1688
    @annotatesubrepoerror
15708
309e49491253 push: propagate --new-branch and --ssh options when pushing subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 15614
diff changeset
  1689
    def push(self, opts):
309e49491253 push: propagate --new-branch and --ssh options when pushing subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 15614
diff changeset
  1690
        force = opts.get('force')
309e49491253 push: propagate --new-branch and --ssh options when pushing subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 15614
diff changeset
  1691
14469
2fdea636f254 subrepo: don't crash when git .hgsubstate is empty (issue2716)
Eric Eisner <ede@alum.mit.edu>
parents: 14205
diff changeset
  1692
        if not self._state[1]:
2fdea636f254 subrepo: don't crash when git .hgsubstate is empty (issue2716)
Eric Eisner <ede@alum.mit.edu>
parents: 14205
diff changeset
  1693
            return True
13553
dea6efdd7ec4 subrepo: don't crash when git repo is missing
Eric Eisner <ede@mit.edu>
parents: 13531
diff changeset
  1694
        if self._gitmissing():
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25980
diff changeset
  1695
            raise error.Abort(_("subrepo %s is missing") % self._relpath)
13029
f930032aa6d5 subrepo: lazier git push logic
Eric Eisner <ede@mit.edu>
parents: 13027
diff changeset
  1696
        # if a branch in origin contains the revision, nothing to do
13178
c4d857f5405d subrepo: backout 519ac79d680b
Eric Eisner <ede@mit.edu>
parents: 13174
diff changeset
  1697
        branch2rev, rev2branch = self._gitbranchmap()
13109
53341289eaf8 subrepo: speed up git push logic
Eric Eisner <ede@mit.edu>
parents: 13108
diff changeset
  1698
        if self._state[1] in rev2branch:
53341289eaf8 subrepo: speed up git push logic
Eric Eisner <ede@mit.edu>
parents: 13108
diff changeset
  1699
            for b in rev2branch[self._state[1]]:
13150
8617b8b74fae subrepo: use low-level git-for-each-ref command in branchmap
Eric Eisner <ede@mit.edu>
parents: 13144
diff changeset
  1700
                if b.startswith('refs/remotes/origin/'):
13109
53341289eaf8 subrepo: speed up git push logic
Eric Eisner <ede@mit.edu>
parents: 13108
diff changeset
  1701
                    return True
13086
8db85e39d59c subrepo: return both mapping directions from gitbranchmap
Eric Eisner <ede@mit.edu>
parents: 13085
diff changeset
  1702
        for b, revision in branch2rev.iteritems():
13150
8617b8b74fae subrepo: use low-level git-for-each-ref command in branchmap
Eric Eisner <ede@mit.edu>
parents: 13144
diff changeset
  1703
            if b.startswith('refs/remotes/origin/'):
13086
8db85e39d59c subrepo: return both mapping directions from gitbranchmap
Eric Eisner <ede@mit.edu>
parents: 13085
diff changeset
  1704
                if self._gitisancestor(self._state[1], revision):
8db85e39d59c subrepo: return both mapping directions from gitbranchmap
Eric Eisner <ede@mit.edu>
parents: 13085
diff changeset
  1705
                    return True
13029
f930032aa6d5 subrepo: lazier git push logic
Eric Eisner <ede@mit.edu>
parents: 13027
diff changeset
  1706
        # otherwise, try to push the currently checked out branch
12994
845c602b8635 subrepo: allow git subrepos to push and merge
Eric Eisner <ede@mit.edu>
parents: 12993
diff changeset
  1707
        cmd = ['push']
845c602b8635 subrepo: allow git subrepos to push and merge
Eric Eisner <ede@mit.edu>
parents: 12993
diff changeset
  1708
        if force:
845c602b8635 subrepo: allow git subrepos to push and merge
Eric Eisner <ede@mit.edu>
parents: 12993
diff changeset
  1709
            cmd.append('--force')
13152
70d80907e4b8 subrepo: defer determination of git's current branch
Eric Eisner <ede@mit.edu>
parents: 13151
diff changeset
  1710
70d80907e4b8 subrepo: defer determination of git's current branch
Eric Eisner <ede@mit.edu>
parents: 13151
diff changeset
  1711
        current = self._gitcurrentbranch()
12995
d90fc91c8377 subrepo: update and merge works with any git branch
Eric Eisner <ede@mit.edu>
parents: 12994
diff changeset
  1712
        if current:
13029
f930032aa6d5 subrepo: lazier git push logic
Eric Eisner <ede@mit.edu>
parents: 13027
diff changeset
  1713
            # determine if the current branch is even useful
f930032aa6d5 subrepo: lazier git push logic
Eric Eisner <ede@mit.edu>
parents: 13027
diff changeset
  1714
            if not self._gitisancestor(self._state[1], current):
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1715
                self.ui.warn(_('unrelated git branch checked out '
13029
f930032aa6d5 subrepo: lazier git push logic
Eric Eisner <ede@mit.edu>
parents: 13027
diff changeset
  1716
                                'in subrepo %s\n') % self._relpath)
f930032aa6d5 subrepo: lazier git push logic
Eric Eisner <ede@mit.edu>
parents: 13027
diff changeset
  1717
                return False
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1718
            self.ui.status(_('pushing branch %s of subrepo %s\n') %
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1719
                           (current.split('/', 2)[2], self._relpath))
20970
70312c95f2f7 subrepo: check return code for git push (issue4223)
Matt Mackall <mpm@selenic.com>
parents: 20870
diff changeset
  1720
            ret = self._gitdir(cmd + ['origin', current])
70312c95f2f7 subrepo: check return code for git push (issue4223)
Matt Mackall <mpm@selenic.com>
parents: 20870
diff changeset
  1721
            return ret[1] == 0
12995
d90fc91c8377 subrepo: update and merge works with any git branch
Eric Eisner <ede@mit.edu>
parents: 12994
diff changeset
  1722
        else:
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1723
            self.ui.warn(_('no branch checked out in subrepo %s\n'
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1724
                           'cannot push revision %s\n') %
13029
f930032aa6d5 subrepo: lazier git push logic
Eric Eisner <ede@mit.edu>
parents: 13027
diff changeset
  1725
                          (self._relpath, self._state[1]))
12995
d90fc91c8377 subrepo: update and merge works with any git branch
Eric Eisner <ede@mit.edu>
parents: 12994
diff changeset
  1726
            return False
12994
845c602b8635 subrepo: allow git subrepos to push and merge
Eric Eisner <ede@mit.edu>
parents: 12993
diff changeset
  1727
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
  1728
    @annotatesubrepoerror
24174
bd9f64ec891d subrepos: support adding files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24173
diff changeset
  1729
    def add(self, ui, match, prefix, explicitonly, **opts):
bd9f64ec891d subrepos: support adding files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24173
diff changeset
  1730
        if self._gitmissing():
bd9f64ec891d subrepos: support adding files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24173
diff changeset
  1731
            return []
24182
00ef3edcf1d5 subrepo: don't exclude files in .hgignore when adding to git
Matt Harbison <matt_harbison@yahoo.com>
parents: 24174
diff changeset
  1732
00ef3edcf1d5 subrepo: don't exclude files in .hgignore when adding to git
Matt Harbison <matt_harbison@yahoo.com>
parents: 24174
diff changeset
  1733
        (modified, added, removed,
24209
6944b64cc28d subrepo: explicitly request clean and unknown files in status for git's add
Matt Harbison <matt_harbison@yahoo.com>
parents: 24183
diff changeset
  1734
         deleted, unknown, ignored, clean) = self.status(None, unknown=True,
6944b64cc28d subrepo: explicitly request clean and unknown files in status for git's add
Matt Harbison <matt_harbison@yahoo.com>
parents: 24183
diff changeset
  1735
                                                         clean=True)
24174
bd9f64ec891d subrepos: support adding files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24173
diff changeset
  1736
24183
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1737
        tracked = set()
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1738
        # dirstates 'amn' warn, 'r' is added again
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1739
        for l in (modified, added, deleted, clean):
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1740
            tracked.update(l)
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1741
24182
00ef3edcf1d5 subrepo: don't exclude files in .hgignore when adding to git
Matt Harbison <matt_harbison@yahoo.com>
parents: 24174
diff changeset
  1742
        # Unknown files not of interest will be rejected by the matcher
00ef3edcf1d5 subrepo: don't exclude files in .hgignore when adding to git
Matt Harbison <matt_harbison@yahoo.com>
parents: 24174
diff changeset
  1743
        files = unknown
00ef3edcf1d5 subrepo: don't exclude files in .hgignore when adding to git
Matt Harbison <matt_harbison@yahoo.com>
parents: 24174
diff changeset
  1744
        files.extend(match.files())
00ef3edcf1d5 subrepo: don't exclude files in .hgignore when adding to git
Matt Harbison <matt_harbison@yahoo.com>
parents: 24174
diff changeset
  1745
24183
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1746
        rejected = []
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1747
24182
00ef3edcf1d5 subrepo: don't exclude files in .hgignore when adding to git
Matt Harbison <matt_harbison@yahoo.com>
parents: 24174
diff changeset
  1748
        files = [f for f in sorted(set(files)) if match(f)]
24174
bd9f64ec891d subrepos: support adding files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24173
diff changeset
  1749
        for f in files:
bd9f64ec891d subrepos: support adding files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24173
diff changeset
  1750
            exact = match.exact(f)
bd9f64ec891d subrepos: support adding files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24173
diff changeset
  1751
            command = ["add"]
bd9f64ec891d subrepos: support adding files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24173
diff changeset
  1752
            if exact:
bd9f64ec891d subrepos: support adding files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24173
diff changeset
  1753
                command.append("-f") #should be added, even if ignored
bd9f64ec891d subrepos: support adding files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24173
diff changeset
  1754
            if ui.verbose or not exact:
bd9f64ec891d subrepos: support adding files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24173
diff changeset
  1755
                ui.status(_('adding %s\n') % match.rel(f))
24183
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1756
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1757
            if f in tracked:  # hg prints 'adding' even if already tracked
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1758
                if exact:
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1759
                    rejected.append(f)
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1760
                continue
24174
bd9f64ec891d subrepos: support adding files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24173
diff changeset
  1761
            if not opts.get('dry_run'):
bd9f64ec891d subrepos: support adding files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24173
diff changeset
  1762
                self._gitcommand(command + [f])
24183
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1763
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1764
        for f in rejected:
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1765
            ui.warn(_("%s already tracked!\n") % match.abs(f))
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1766
932de135041f subrepo: warn when adding already tracked files in gitsubrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 24182
diff changeset
  1767
        return rejected
24174
bd9f64ec891d subrepos: support adding files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24173
diff changeset
  1768
bd9f64ec891d subrepos: support adding files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24173
diff changeset
  1769
    @annotatesubrepoerror
12996
3a42651b0a62 subrepo: removing (and restoring) git subrepo state
Eric Eisner <ede@mit.edu>
parents: 12995
diff changeset
  1770
    def remove(self):
13553
dea6efdd7ec4 subrepo: don't crash when git repo is missing
Eric Eisner <ede@mit.edu>
parents: 13531
diff changeset
  1771
        if self._gitmissing():
dea6efdd7ec4 subrepo: don't crash when git repo is missing
Eric Eisner <ede@mit.edu>
parents: 13531
diff changeset
  1772
            return
12996
3a42651b0a62 subrepo: removing (and restoring) git subrepo state
Eric Eisner <ede@mit.edu>
parents: 12995
diff changeset
  1773
        if self.dirty():
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1774
            self.ui.warn(_('not removing repo %s because '
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1775
                           'it has changes.\n') % self._relpath)
12996
3a42651b0a62 subrepo: removing (and restoring) git subrepo state
Eric Eisner <ede@mit.edu>
parents: 12995
diff changeset
  1776
            return
3a42651b0a62 subrepo: removing (and restoring) git subrepo state
Eric Eisner <ede@mit.edu>
parents: 12995
diff changeset
  1777
        # we can't fully delete the repository as it may contain
3a42651b0a62 subrepo: removing (and restoring) git subrepo state
Eric Eisner <ede@mit.edu>
parents: 12995
diff changeset
  1778
        # local-only history
23572
40e62fbd7356 subrepo: rename the '_ui' member to 'ui'
Matt Harbison <matt_harbison@yahoo.com>
parents: 23571
diff changeset
  1779
        self.ui.note(_('removing subrepo %s\n') % self._relpath)
12996
3a42651b0a62 subrepo: removing (and restoring) git subrepo state
Eric Eisner <ede@mit.edu>
parents: 12995
diff changeset
  1780
        self._gitcommand(['config', 'core.bare', 'true'])
24688
897a0715ee71 subrepo: use vfs.readdir instead of os.listdir to avoid expensive stat calls
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24675
diff changeset
  1781
        for f, kind in self.wvfs.readdir():
12996
3a42651b0a62 subrepo: removing (and restoring) git subrepo state
Eric Eisner <ede@mit.edu>
parents: 12995
diff changeset
  1782
            if f == '.git':
3a42651b0a62 subrepo: removing (and restoring) git subrepo state
Eric Eisner <ede@mit.edu>
parents: 12995
diff changeset
  1783
                continue
24688
897a0715ee71 subrepo: use vfs.readdir instead of os.listdir to avoid expensive stat calls
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24675
diff changeset
  1784
            if kind == stat.S_IFDIR:
24690
d1ddf1fe5d33 subrepo: use vfs.rmtree instead of shutil.rmtree
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24688
diff changeset
  1785
                self.wvfs.rmtree(f)
12996
3a42651b0a62 subrepo: removing (and restoring) git subrepo state
Eric Eisner <ede@mit.edu>
parents: 12995
diff changeset
  1786
            else:
24691
def1145cec2d subrepo: use vfs.unlink instead of os.remove
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24690
diff changeset
  1787
                self.wvfs.unlink(f)
12996
3a42651b0a62 subrepo: removing (and restoring) git subrepo state
Eric Eisner <ede@mit.edu>
parents: 12995
diff changeset
  1788
31099
b44ab288358e subrepo: run the repo decoders when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 30755
diff changeset
  1789
    def archive(self, archiver, prefix, match=None, decode=True):
18967
88d1b59f6906 archive: raise error.Abort if the file pattern matches no files
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18964
diff changeset
  1790
        total = 0
13027
7f2ecb64140d subrepo: archive git subrepos
Eric Eisner <ede@mit.edu>
parents: 13018
diff changeset
  1791
        source, revision = self._state
14469
2fdea636f254 subrepo: don't crash when git .hgsubstate is empty (issue2716)
Eric Eisner <ede@alum.mit.edu>
parents: 14205
diff changeset
  1792
        if not revision:
18967
88d1b59f6906 archive: raise error.Abort if the file pattern matches no files
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18964
diff changeset
  1793
            return total
13027
7f2ecb64140d subrepo: archive git subrepos
Eric Eisner <ede@mit.edu>
parents: 13018
diff changeset
  1794
        self._fetch(source, revision)
7f2ecb64140d subrepo: archive git subrepos
Eric Eisner <ede@mit.edu>
parents: 13018
diff changeset
  1795
7f2ecb64140d subrepo: archive git subrepos
Eric Eisner <ede@mit.edu>
parents: 13018
diff changeset
  1796
        # Parse git's native archive command.
7f2ecb64140d subrepo: archive git subrepos
Eric Eisner <ede@mit.edu>
parents: 13018
diff changeset
  1797
        # This should be much faster than manually traversing the trees
7f2ecb64140d subrepo: archive git subrepos
Eric Eisner <ede@mit.edu>
parents: 13018
diff changeset
  1798
        # and objects with many subprocess calls.
7f2ecb64140d subrepo: archive git subrepos
Eric Eisner <ede@mit.edu>
parents: 13018
diff changeset
  1799
        tarstream = self._gitcommand(['archive', revision], stream=True)
7f2ecb64140d subrepo: archive git subrepos
Eric Eisner <ede@mit.edu>
parents: 13018
diff changeset
  1800
        tar = tarfile.open(fileobj=tarstream, mode='r|')
13144
aae2d5cbde64 subrepo: add progress bar support to archive
Martin Geisler <mg@aragost.com>
parents: 13137
diff changeset
  1801
        relpath = subrelpath(self)
23575
a2f139d25845 subrepo: drop the 'ui' parameter to archive()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23574
diff changeset
  1802
        self.ui.progress(_('archiving (%s)') % relpath, 0, unit=_('files'))
13144
aae2d5cbde64 subrepo: add progress bar support to archive
Martin Geisler <mg@aragost.com>
parents: 13137
diff changeset
  1803
        for i, info in enumerate(tar):
13180
a79e0688a5ee subrepo: fix git archive parsing of directories and symfiles
Eric Eisner <ede@mit.edu>
parents: 13179
diff changeset
  1804
            if info.isdir():
a79e0688a5ee subrepo: fix git archive parsing of directories and symfiles
Eric Eisner <ede@mit.edu>
parents: 13179
diff changeset
  1805
                continue
17108
1894dac619de subrepo: propagate matcher to subrepos when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 17036
diff changeset
  1806
            if match and not match(info.name):
1894dac619de subrepo: propagate matcher to subrepos when archiving
Matt Harbison <matt_harbison@yahoo.com>
parents: 17036
diff changeset
  1807
                continue
13180
a79e0688a5ee subrepo: fix git archive parsing of directories and symfiles
Eric Eisner <ede@mit.edu>
parents: 13179
diff changeset
  1808
            if info.issym():
a79e0688a5ee subrepo: fix git archive parsing of directories and symfiles
Eric Eisner <ede@mit.edu>
parents: 13179
diff changeset
  1809
                data = info.linkname
a79e0688a5ee subrepo: fix git archive parsing of directories and symfiles
Eric Eisner <ede@mit.edu>
parents: 13179
diff changeset
  1810
            else:
a79e0688a5ee subrepo: fix git archive parsing of directories and symfiles
Eric Eisner <ede@mit.edu>
parents: 13179
diff changeset
  1811
                data = tar.extractfile(info).read()
24924
41cd8171e58f archive: always use portable path component separators with subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 24877
diff changeset
  1812
            archiver.addfile(prefix + self._path + '/' + info.name,
13180
a79e0688a5ee subrepo: fix git archive parsing of directories and symfiles
Eric Eisner <ede@mit.edu>
parents: 13179
diff changeset
  1813
                             info.mode, info.issym(), data)
18967
88d1b59f6906 archive: raise error.Abort if the file pattern matches no files
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18964
diff changeset
  1814
            total += 1
23575
a2f139d25845 subrepo: drop the 'ui' parameter to archive()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23574
diff changeset
  1815
            self.ui.progress(_('archiving (%s)') % relpath, i + 1,
a2f139d25845 subrepo: drop the 'ui' parameter to archive()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23574
diff changeset
  1816
                             unit=_('files'))
a2f139d25845 subrepo: drop the 'ui' parameter to archive()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23574
diff changeset
  1817
        self.ui.progress(_('archiving (%s)') % relpath, None)
18967
88d1b59f6906 archive: raise error.Abort if the file pattern matches no files
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18964
diff changeset
  1818
        return total
13144
aae2d5cbde64 subrepo: add progress bar support to archive
Martin Geisler <mg@aragost.com>
parents: 13137
diff changeset
  1819
13027
7f2ecb64140d subrepo: archive git subrepos
Eric Eisner <ede@mit.edu>
parents: 13018
diff changeset
  1820
18109
9e3910db4e78 subrepo: append subrepo path to subrepo error messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18031
diff changeset
  1821
    @annotatesubrepoerror
23991
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1822
    def cat(self, match, prefix, **opts):
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1823
        rev = self._state[1]
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1824
        if match.anypats():
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1825
            return 1 #No support for include/exclude yet
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1826
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1827
        if not match.files():
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1828
            return 1
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1829
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1830
        for f in match.files():
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1831
            output = self._gitcommand(["show", "%s:%s" % (rev, f)])
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1832
            fp = cmdutil.makefileobj(self._subparent, opts.get('output'),
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1833
                                     self._ctx.node(),
24675
47e7d5fbbf04 subrepo: use vfs.reljoin instead of os.path.join
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24674
diff changeset
  1834
                                     pathname=self.wvfs.reljoin(prefix, f))
23991
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1835
            fp.write(output)
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1836
            fp.close()
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1837
        return 0
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1838
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1839
07c1a7d1ef69 subrepo: add 'cat' support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23963
diff changeset
  1840
    @annotatesubrepoerror
13182
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1841
    def status(self, rev2, **opts):
14469
2fdea636f254 subrepo: don't crash when git .hgsubstate is empty (issue2716)
Eric Eisner <ede@alum.mit.edu>
parents: 14205
diff changeset
  1842
        rev1 = self._state[1]
2fdea636f254 subrepo: don't crash when git .hgsubstate is empty (issue2716)
Eric Eisner <ede@alum.mit.edu>
parents: 14205
diff changeset
  1843
        if self._gitmissing() or not rev1:
13553
dea6efdd7ec4 subrepo: don't crash when git repo is missing
Eric Eisner <ede@mit.edu>
parents: 13531
diff changeset
  1844
            # if the repo is missing, return no results
24210
99362821b25b subrepo: always return scmutil.status() from gitsubrepo.status()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24209
diff changeset
  1845
            return scmutil.status([], [], [], [], [], [], [])
13182
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1846
        modified, added, removed = [], [], []
15531
0810ccc51f0a subrepo: fix git status false positive (issue3109)
Eric Roshan Eisner <ede@alum.mit.edu>
parents: 15498
diff changeset
  1847
        self._gitupdatestat()
13182
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1848
        if rev2:
28618
7dab4caf11bc subrepo: adapt to git's recent renames-by-default
Martin von Zweigbergk <martinvonz@google.com>
parents: 27935
diff changeset
  1849
            command = ['diff-tree', '--no-renames', '-r', rev1, rev2]
13182
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1850
        else:
28618
7dab4caf11bc subrepo: adapt to git's recent renames-by-default
Martin von Zweigbergk <martinvonz@google.com>
parents: 27935
diff changeset
  1851
            command = ['diff-index', '--no-renames', rev1]
13182
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1852
        out = self._gitcommand(command)
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1853
        for line in out.split('\n'):
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1854
            tab = line.find('\t')
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1855
            if tab == -1:
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1856
                continue
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1857
            status, f = line[tab - 1], line[tab + 1:]
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1858
            if status == 'M':
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1859
                modified.append(f)
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1860
            elif status == 'A':
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1861
                added.append(f)
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1862
            elif status == 'D':
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1863
                removed.append(f)
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1864
22927
7d754b7acd55 subrepo: use separate instances of empty lists in status
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22914
diff changeset
  1865
        deleted, unknown, ignored, clean = [], [], [], []
23411
2d86f4e38c08 subrepo: add status support for ignored files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23373
diff changeset
  1866
24256
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1867
        command = ['status', '--porcelain', '-z']
24211
1e3e064c16a1 subrepo: only fetch unknown files from git when explicitly requested
Matt Harbison <matt_harbison@yahoo.com>
parents: 24210
diff changeset
  1868
        if opts.get('unknown'):
24256
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1869
            command += ['--untracked-files=all']
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1870
        if opts.get('ignored'):
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1871
            command += ['--ignored']
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1872
        out = self._gitcommand(command)
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1873
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1874
        changedfiles = set()
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1875
        changedfiles.update(modified)
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1876
        changedfiles.update(added)
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1877
        changedfiles.update(removed)
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1878
        for line in out.split('\0'):
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1879
            if not line:
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1880
                continue
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1881
            st = line[0:2]
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1882
            #moves and copies show 2 files on one line
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1883
            if line.find('\0') >= 0:
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1884
                filename1, filename2 = line[3:].split('\0')
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1885
            else:
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1886
                filename1 = line[3:]
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1887
                filename2 = None
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1888
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1889
            changedfiles.add(filename1)
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1890
            if filename2:
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1891
                changedfiles.add(filename2)
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1892
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1893
            if st == '??':
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1894
                unknown.append(filename1)
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1895
            elif st == '!!':
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1896
                ignored.append(filename1)
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1897
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1898
        if opts.get('clean'):
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1899
            out = self._gitcommand(['ls-files'])
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1900
            for f in out.split('\n'):
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1901
                if not f in changedfiles:
e964edc3274e subrepo: add status support for ignored and clean files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24211
diff changeset
  1902
                    clean.append(f)
23411
2d86f4e38c08 subrepo: add status support for ignored files in git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23373
diff changeset
  1903
22914
c95db3208a33 status: update various other methods to return new class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22695
diff changeset
  1904
        return scmutil.status(modified, added, removed, deleted,
c95db3208a33 status: update various other methods to return new class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22695
diff changeset
  1905
                              unknown, ignored, clean)
13182
2537bd17421d subrepo: basic support for status of git subrepos
Eric Eisner <ede@mit.edu>
parents: 13181
diff changeset
  1906
23523
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1907
    @annotatesubrepoerror
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1908
    def diff(self, ui, diffopts, node2, match, prefix, **opts):
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1909
        node1 = self._state[1]
28618
7dab4caf11bc subrepo: adapt to git's recent renames-by-default
Martin von Zweigbergk <martinvonz@google.com>
parents: 27935
diff changeset
  1910
        cmd = ['diff', '--no-renames']
23523
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1911
        if opts['stat']:
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1912
            cmd.append('--stat')
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1913
        else:
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1914
            # for Git, this also implies '-p'
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1915
            cmd.append('-U%d' % diffopts.context)
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1916
24675
47e7d5fbbf04 subrepo: use vfs.reljoin instead of os.path.join
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24674
diff changeset
  1917
        gitprefix = self.wvfs.reljoin(prefix, self._path)
23523
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1918
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1919
        if diffopts.noprefix:
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1920
            cmd.extend(['--src-prefix=%s/' % gitprefix,
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1921
                        '--dst-prefix=%s/' % gitprefix])
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1922
        else:
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1923
            cmd.extend(['--src-prefix=a/%s/' % gitprefix,
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1924
                        '--dst-prefix=b/%s/' % gitprefix])
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1925
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1926
        if diffopts.ignorews:
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1927
            cmd.append('--ignore-all-space')
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1928
        if diffopts.ignorewsamount:
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1929
            cmd.append('--ignore-space-change')
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1930
        if self._gitversion(self._gitcommand(['--version'])) >= (1, 8, 4) \
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1931
                and diffopts.ignoreblanklines:
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1932
            cmd.append('--ignore-blank-lines')
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1933
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1934
        cmd.append(node1)
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1935
        if node2:
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1936
            cmd.append(node2)
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1937
23938
de519517f597 subrepo: correctly add newline for git subrepo diffs
Mathias De Maré <mathias.demare@gmail.com>
parents: 23885
diff changeset
  1938
        output = ""
23523
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1939
        if match.always():
23938
de519517f597 subrepo: correctly add newline for git subrepo diffs
Mathias De Maré <mathias.demare@gmail.com>
parents: 23885
diff changeset
  1940
            output += self._gitcommand(cmd) + '\n'
24778
a48b65ab428d subrepo: add include/exclude support for diffing git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24726
diff changeset
  1941
        else:
a48b65ab428d subrepo: add include/exclude support for diffing git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24726
diff changeset
  1942
            st = self.status(node2)[:3]
a48b65ab428d subrepo: add include/exclude support for diffing git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24726
diff changeset
  1943
            files = [f for sublist in st for f in sublist]
a48b65ab428d subrepo: add include/exclude support for diffing git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24726
diff changeset
  1944
            for f in files:
a48b65ab428d subrepo: add include/exclude support for diffing git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24726
diff changeset
  1945
                if match(f):
a48b65ab428d subrepo: add include/exclude support for diffing git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 24726
diff changeset
  1946
                    output += self._gitcommand(cmd + ['--', f]) + '\n'
23938
de519517f597 subrepo: correctly add newline for git subrepo diffs
Mathias De Maré <mathias.demare@gmail.com>
parents: 23885
diff changeset
  1947
de519517f597 subrepo: correctly add newline for git subrepo diffs
Mathias De Maré <mathias.demare@gmail.com>
parents: 23885
diff changeset
  1948
        if output.strip():
de519517f597 subrepo: correctly add newline for git subrepo diffs
Mathias De Maré <mathias.demare@gmail.com>
parents: 23885
diff changeset
  1949
            ui.write(output)
23523
01a8dfc79cdc subrepo: add partial diff support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23522
diff changeset
  1950
23679
dd1e73c4be13 subrepo: add forgotten annotation for reverting git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23678
diff changeset
  1951
    @annotatesubrepoerror
23580
e20f36ad092e subrepo: fix git subrepo ui argument
Matt Mackall <mpm@selenic.com>
parents: 23579
diff changeset
  1952
    def revert(self, substate, *pats, **opts):
e20f36ad092e subrepo: fix git subrepo ui argument
Matt Mackall <mpm@selenic.com>
parents: 23579
diff changeset
  1953
        self.ui.status(_('reverting subrepo %s\n') % substate[0])
23550
7fa2189c1e87 subrepo: add revert support without backup for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23540
diff changeset
  1954
        if not opts.get('no_backup'):
23678
194d2f185008 subrepo: add full revert support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23666
diff changeset
  1955
            status = self.status(None)
194d2f185008 subrepo: add full revert support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23666
diff changeset
  1956
            names = status.modified
194d2f185008 subrepo: add full revert support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23666
diff changeset
  1957
            for name in names:
27651
07fc2f2134ba origpath: move from cmdutil to scmutil
Siddharth Agarwal <sid0@fb.com>
parents: 26940
diff changeset
  1958
                bakname = scmutil.origpath(self.ui, self._subparent, name)
23678
194d2f185008 subrepo: add full revert support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23666
diff changeset
  1959
                self.ui.note(_('saving current version of %s as %s\n') %
194d2f185008 subrepo: add full revert support for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23666
diff changeset
  1960
                        (name, bakname))
24695
419528cb05b6 subrepo: convert the os.path references in git to vfs
Matt Harbison <matt_harbison@yahoo.com>
parents: 24694
diff changeset
  1961
                self.wvfs.rename(name, bakname)
23550
7fa2189c1e87 subrepo: add revert support without backup for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23540
diff changeset
  1962
24134
afed5d2e7985 revert: display full subrepo output with --dry-run
Matt Harbison <matt_harbison@yahoo.com>
parents: 24132
diff changeset
  1963
        if not opts.get('dry_run'):
afed5d2e7985 revert: display full subrepo output with --dry-run
Matt Harbison <matt_harbison@yahoo.com>
parents: 24132
diff changeset
  1964
            self.get(substate, overwrite=True)
23550
7fa2189c1e87 subrepo: add revert support without backup for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23540
diff changeset
  1965
        return []
7fa2189c1e87 subrepo: add revert support without backup for git subrepos
Mathias De Maré <mathias.demare@gmail.com>
parents: 23540
diff changeset
  1966
21400
78a60daacea8 subrepo: add shortid() method to subrepo classes
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21041
diff changeset
  1967
    def shortid(self, revid):
78a60daacea8 subrepo: add shortid() method to subrepo classes
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21041
diff changeset
  1968
        return revid[:7]
78a60daacea8 subrepo: add shortid() method to subrepo classes
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21041
diff changeset
  1969
10177
5ca0d220ae21 subrepo: add table-based dispatch for subrepo types
Augie Fackler <durin42@gmail.com>
parents: 10175
diff changeset
  1970
types = {
5ca0d220ae21 subrepo: add table-based dispatch for subrepo types
Augie Fackler <durin42@gmail.com>
parents: 10175
diff changeset
  1971
    'hg': hgsubrepo,
10178
cd477be6f2fc subrepo: Subversion support
Augie Fackler <durin42@gmail.com>
parents: 10177
diff changeset
  1972
    'svn': svnsubrepo,
12992
2b73a3279a9f subrepo: support for adding a git subrepo
Eric Eisner <ede@mit.edu>
parents: 12930
diff changeset
  1973
    'git': gitsubrepo,
10177
5ca0d220ae21 subrepo: add table-based dispatch for subrepo types
Augie Fackler <durin42@gmail.com>
parents: 10175
diff changeset
  1974
    }