aboutsummaryrefslogtreecommitdiff
blob: cd7c9fc5f68ff469f9dbafdff468e61f04dc8204 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import sys
import logging

try:
	import configparser
except ImportError as running_python2:
	# configparser is named ConfigParser in python2
	import ConfigParser as configparser


from roverlay import config

from roverlay.remote.basicrepo import LocalRepo
from roverlay.remote.repo      import RsyncRepo

LOGGER = logging.getLogger ( 'repoloader' )

def read_repofile ( repo_file, lenient=False ):

	parser = configparser.SafeConfigParser ( allow_no_value=False )

	if lenient:
		parser.read ( repo_file )
	else:
		fh = None
		try:
			fh = open ( repo_file, 'r' )
			parser.readfp ( fh )
		finally:
			if fh: fh.close()

	repos = list()

	for name in parser.sections():

		if sys.version_info < ( 3, 2 ):
			# FIXME replace this and use more accurate version condition
			get = lambda a, b=None: parser.get ( name, a, raw=True ) \
				if parser.has_option ( name, a ) else b
		else:
			get = lambda a, b=None : parser.get ( name, a, raw=True, fallback=b )

		repo_type = get ( 'type', 'rsync' ).lower()

		if repo_type == 'local':
			repo = LocalRepo (
				name      = get ( 'name', name ),
				directory = get ( 'directory' ),
				src_uri   = get ( 'src_uri' )
			)
		elif repo_type == 'rsync':
			extra_opts = get ( 'extra_rsync_opts' )
			if extra_opts:
				extra_opts = extra_opts.split ( ' ' )

			repo = RsyncRepo (
				name             = get ( 'name', name ),
				directory        = get ( 'directory' ),
				src_uri          = get ( 'src_uri' ),
				rsync_uri        = get ( 'rsync_uri' ),
				base_uri         = get ( 'base_uri' ),
				extra_opts       = extra_opts,
				recursive        = get ( 'recursive', False ) == 'yes',
			)
		else:
			LOGGER.error ( "Unknown repo type %s for %s" % ( repo_type, name ) )
			continue

		LOGGER.debug ( 'New entry, ' + str ( repo ) )

		repos.append ( repo )
		repo = None


	return repos
# --- end of read_repofile (...) ---