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