<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[154424] contrib/buildbot-test</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="https://trac.macports.org/changeset/154424">154424</a></dd>
<dt>Author</dt> <dd>larryv@macports.org</dd>
<dt>Date</dt> <dd>2016-10-29 03:25:46 +0200 (Sat, 29 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>buildbot: Improve configuration override

- Trim config.json.sample by removing keys that are unlikely to be
  changed. They just duplicate the defaults from master.cfg.

- Replace hardcoded settings with config defaults to allow overriding
  them from the config file.

- Organize defaults a bit since there are so many of them now.

- Catch IOError when reading the config file instead of checking for
  existence.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#contribbuildbottestconfigjsonsample">contrib/buildbot-test/config.json.sample</a></li>
<li><a href="#contribbuildbottestmastercfg">contrib/buildbot-test/master.cfg</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="contribbuildbottestconfigjsonsample"></a>
<div class="modfile"><h4>Modified: contrib/buildbot-test/config.json.sample (154423 => 154424)</h4>
<pre class="diff"><span>
<span class="info">--- contrib/buildbot-test/config.json.sample 2016-10-29 01:25:02 UTC (rev 154423)
+++ contrib/buildbot-test/config.json.sample    2016-10-29 01:25:46 UTC (rev 154424)
</span><span class="lines">@@ -1,13 +1,7 @@
</span><span class="cx"> {
</span><span class="cx">     "production":   false,
</span><span class="cx">     "privkey":      "/var/keys/macports-privkey.pem",
</span><del>-    "slaveport":    9989,
-    "httpport":     8010,
-    "buildboturl":  "http://localhost:8010/",
-    "htpasswdfile": "htpasswd",
-    "mpbbsvnurl":   "https://svn.macports.org/repository/macports/contrib/mp-buildbot",
-    "svnurl":       "https://svn.macports.org/repository/macports/trunk",
-    "archivesite":  "https://packages.macports.org",
</del><ins>+    "buildboturl":  "http://domain.tld:8010/",
</ins><span class="cx">     "slaveprefix":  "/opt/local",
</span><span class="cx">     "toolsprefix":  "/opt/mports",
</span><span class="cx">     "deploy": {
</span></span></pre></div>
<a id="contribbuildbottestmastercfg"></a>
<div class="modfile"><h4>Modified: contrib/buildbot-test/master.cfg (154423 => 154424)</h4>
<pre class="diff"><span>
<span class="info">--- contrib/buildbot-test/master.cfg 2016-10-29 01:25:02 UTC (rev 154423)
+++ contrib/buildbot-test/master.cfg    2016-10-29 01:25:46 UTC (rev 154424)
</span><span class="lines">@@ -45,29 +45,57 @@
</span><span class="cx"> # a shorter alias to save typing.
</span><span class="cx"> c = BuildmasterConfig = {}
</span><span class="cx"> 
</span><del>-# Master variable to toggle config between testing on your personal system
-# (where /opt/local shouldn't be messed with) and the production server (where
-# it has to be)
-
</del><span class="cx"> config = {
</span><ins>+    # Production or development
</ins><span class="cx">     'production': False,
</span><del>-    'privkey': '',
</del><ins>+
+    # Connections
</ins><span class="cx">     'slaveport': 9989,
</span><span class="cx">     'httpport': 8010,
</span><del>-    'buildboturl': 'http://localhost:8010/',
-    'htpasswdfile': 'htpasswd',
</del><ins>+
+    # External configuration. Use absolute paths when overriding these.
+    'configfile': _path('config.json'),
+    'workersfile': _path('slaves.json'),
+    'htpasswdfile': _path('htpasswd'),
+
+    # Sources
</ins><span class="cx">     'mpbbsvnurl': 'https://svn.macports.org/repository/macports/contrib/mp-buildbot',
</span><span class="cx">     'svnurl': 'https://svn.macports.org/repository/macports/trunk',
</span><del>-    'archivesite': 'https://packages.macports.org',
</del><ins>+
+    # Tooling
</ins><span class="cx">     'slaveprefix': '/opt/local',
</span><span class="cx">     'toolsprefix': '/opt/mports',
</span><del>-    'deploy': {}
</del><ins>+
+    # Deployment
+    'archivesite': 'https://packages.macports.org',
+    'privkey': '',
+    'deploy': {},
+
+    # Site definitions
+    # (http://docs.buildbot.net/0.8.12/manual/cfg-global.html#site-definitions)
+    'title': 'MacPorts',
+    'titleurl': 'https://www.macports.org/',
+    'buildboturl': 'http://localhost:8010/',
+
+    # Database
+    # (http://docs.buildbot.net/0.8.12/manual/cfg-global.html#database-specification)
+    'db': {'db_url': 'sqlite:///state.sqlite'},
+
+    # Data lifetime
+    # (http://docs.buildbot.net/0.8.12/manual/cfg-global.html#data-lifetime)
+    'buildcachesize': 600,
+    'buildhorizon': 10000,
+    'eventhorizon': 2000,
+    'loghorizon': 5000
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-if os.path.exists(_path('config.json')):
-    with open(_path('config.json')) as f:
-        configdata = json.load(f)
-    config.update(configdata)
</del><ins>+# Override defaults with external settings.
+try:
+    with open(config['configfile']) as f:
+        extconfig = json.load(f)
+except IOError:
+    extconfig = {}
+config.update(extconfig)
</ins><span class="cx"> 
</span><span class="cx"> path_base = '/usr/bin:/bin:/usr/sbin:/sbin'
</span><span class="cx"> path_ports = os.path.join(config['toolsprefix'], 'bin') + ':' + path_base
</span><span class="lines">@@ -83,7 +111,7 @@
</span><span class="cx"> # a BuildSlave object, specifying a unique slave name and password.  The same
</span><span class="cx"> # slave name and password must be configured on the slave.
</span><span class="cx"> 
</span><del>-with open(_path('slaves.json')) as f:
</del><ins>+with open(config['workersfile']) as f:
</ins><span class="cx">     slavedata = json.load(f)
</span><span class="cx"> 
</span><span class="cx"> # convert unicode to byte strings
</span><span class="lines">@@ -774,9 +802,8 @@
</span><span class="cx"> # installation's WebStatus home page (linked to the
</span><span class="cx"> # 'titleURL') and is embedded in the title of the waterfall HTML page.
</span><span class="cx"> 
</span><del>-c['title'] = 'MacPorts'
-c['titleURL'] = 'https://www.macports.org/'
-
</del><ins>+c['title'] = config['title']
+c['titleURL'] = config['titleurl']
</ins><span class="cx"> c['buildbotURL'] = config['buildboturl']
</span><span class="cx"> c['status'].append(WebStatus(
</span><span class="cx">     http_port=config['httpport'],
</span><span class="lines">@@ -791,11 +818,11 @@
</span><span class="cx"> 
</span><span class="cx"> # This specifies what database buildbot uses to store its state. You can
</span><span class="cx"> # leave this at its default for all but the largest installations.
</span><del>-c['db'] = {'db_url': 'sqlite:///state.sqlite'}
</del><ins>+c['db'] = config['db']
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> ####### DATA LIFETIME #######
</span><del>-c['buildHorizon'] = 10000
-c['logHorizon'] = 5000
-c['eventHorizon'] = 2000
-c['buildCacheSize'] = 600
</del><ins>+c['buildHorizon'] = config['buildhorizon']
+c['logHorizon'] = config['loghorizon']
+c['eventHorizon'] = config['eventhorizon']
+c['buildCacheSize'] = config['buildcachesize']
</ins></span></pre>
</div>
</div>

</body>
</html>