comparison mercurial/subrepo.py @ 8813:db3c1ab0e632

commit: recurse into subrepositories
author Matt Mackall <mpm@selenic.com>
date Mon, 15 Jun 2009 02:45:38 -0500
parents 859f841937d0
children ab668c92a036
comparison
equal deleted inserted replaced
8812:859f841937d0 8813:db3c1ab0e632
3 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com> 3 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
4 # 4 #
5 # This software may be used and distributed according to the terms of the 5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2, incorporated herein by reference. 6 # GNU General Public License version 2, incorporated herein by reference.
7 7
8 import config, util, errno 8 import errno, os
9 import config, util, node, error
10 localrepo = None
11
12 nullstate = ('', '')
9 13
10 def state(ctx): 14 def state(ctx):
11 p = config.config() 15 p = config.config()
12 def read(f, sections=None, remap=None): 16 def read(f, sections=None, remap=None):
13 if f in ctx: 17 if f in ctx:
31 state = {} 35 state = {}
32 for path, src in p[''].items(): 36 for path, src in p[''].items():
33 state[path] = (src, rev.get(path, '')) 37 state[path] = (src, rev.get(path, ''))
34 38
35 return state 39 return state
40
41 def writestate(repo, state):
42 repo.wwrite('.hgsubstate',
43 ''.join(['%s %s\n' % (state[s][1], s)
44 for s in sorted(state)]), '')
45
46 def subrepo(ctx, path):
47 # subrepo inherently violates our import layering rules
48 # because it wants to make repo objects from deep inside the stack
49 # so we manually delay the circular imports to not break
50 # scripts that don't use our demand-loading
51 global localrepo
52 import localrepo as l
53 localrepo = l
54
55 state = ctx.substate.get(path, nullstate)
56 if state[0].startswith('['): # future expansion
57 raise error.Abort('unknown subrepo source %s' % state[0])
58 return hgsubrepo(ctx, path, state)
59
60 class hgsubrepo(object):
61 def __init__(self, ctx, path, state):
62 self._parent = ctx
63 self._path = path
64 self._state = state
65 r = ctx._repo
66 root = r.wjoin(path)
67 self._repo = localrepo.localrepository(r.ui, root)
68
69 def dirty(self):
70 r = self._state[1]
71 if r == '':
72 return True
73 w = self._repo[None]
74 if w.p1() != self._repo[r]: # version checked out changed
75 return True
76 return w.dirty() # working directory changed
77
78 def commit(self, text, user, date):
79 n = self._repo.commit(text, user, date)
80 if not n:
81 return self._repo['.'].hex() # different version checked out
82 return node.hex(n)