##// END OF EJS Templates
hgwebdir: export collections of repos...
Vadim Gelfer -
r1829:b0f6af32 default
parent child Browse files
Show More
@@ -8,10 +8,21 b' cgitb.enable()'
8 # sys.path.insert(0, "/path/to/python/lib") # if not a system-wide install
8 # sys.path.insert(0, "/path/to/python/lib") # if not a system-wide install
9 from mercurial import hgweb
9 from mercurial import hgweb
10
10
11 # The config file looks like this:
11 # The config file looks like this. You can have paths to individual
12 # repos, collections of repos in a directory tree, or both.
13 #
12 # [paths]
14 # [paths]
13 # virtual/path = /real/path
15 # virtual/path = /real/path
14 # virtual/path = /real/path
16 # virtual/path = /real/path
17 #
18 # [collections]
19 # /prefix/to/strip/off = /root/of/tree/full/of/repos
20 #
21 # collections example: say directory tree /foo contains repos /foo/bar,
22 # /foo/quux/baz. Give this config section:
23 # [collections]
24 # /foo = /foo
25 # Then repos will list as bar and quux/baz.
15
26
16 # Alternatively you can pass a list of ('virtual/path', '/real/path') tuples
27 # Alternatively you can pass a list of ('virtual/path', '/real/path') tuples
17 # or use a dictionary with entries like 'virtual/path': '/real/path'
28 # or use a dictionary with entries like 'virtual/path': '/real/path'
@@ -1075,17 +1075,27 b' def create_server(repo):'
1075 class hgwebdir(object):
1075 class hgwebdir(object):
1076 def __init__(self, config):
1076 def __init__(self, config):
1077 def cleannames(items):
1077 def cleannames(items):
1078 return [(name.strip('/'), path) for name, path in items]
1078 return [(name.strip(os.sep), path) for name, path in items]
1079
1079
1080 if type(config) == type([]):
1080 if isinstance(config, (list, tuple)):
1081 self.repos = cleannames(config)
1081 self.repos = cleannames(config)
1082 elif type(config) == type({}):
1082 elif isinstance(config, dict):
1083 self.repos = cleannames(config.items())
1083 self.repos = cleannames(config.items())
1084 self.repos.sort()
1084 self.repos.sort()
1085 else:
1085 else:
1086 cp = ConfigParser.SafeConfigParser()
1086 cp = ConfigParser.SafeConfigParser()
1087 cp.read(config)
1087 cp.read(config)
1088 self.repos = cleannames(cp.items("paths"))
1088 self.repos = []
1089 if cp.has_section('paths'):
1090 self.repos.extend(cleannames(cp.items('paths')))
1091 if cp.has_section('collections'):
1092 for prefix, root in cp.items('collections'):
1093 for path in util.walkrepos(root):
1094 repo = os.path.normpath(path)
1095 name = repo
1096 if name.startswith(prefix):
1097 name = name[len(prefix):]
1098 self.repos.append((name.lstrip(os.sep), repo))
1089 self.repos.sort()
1099 self.repos.sort()
1090
1100
1091 def run(self, req=hgrequest()):
1101 def run(self, req=hgrequest()):
@@ -690,3 +690,16 b" def datestr(date=None, format='%c'):"
690 (time.strftime(format, time.gmtime(float(t) - tz)),
690 (time.strftime(format, time.gmtime(float(t) - tz)),
691 -tz / 3600,
691 -tz / 3600,
692 ((-tz % 3600) / 60)))
692 ((-tz % 3600) / 60)))
693
694 def walkrepos(path):
695 '''yield every hg repository under path, recursively.'''
696 def errhandler(err):
697 if err.filename == path:
698 raise err
699
700 for root, dirs, files in os.walk(path, onerror=errhandler):
701 for d in dirs:
702 if d == '.hg':
703 yield root
704 dirs[:] = []
705 break
General Comments 0
You need to be logged in to leave comments. Login now