summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bin')
-rw-r--r--bin/SConsDoc.py220
-rw-r--r--bin/SConsExamples.py65
-rw-r--r--bin/import-test.py4
-rw-r--r--bin/linecount.py4
-rw-r--r--bin/restore.sh30
-rw-r--r--bin/scons-cdist272
-rw-r--r--bin/scons-test.py1
-rw-r--r--bin/scons_dev_master.py23
-rw-r--r--bin/time-scons.py2
-rw-r--r--bin/update-release-info.py43
-rwxr-xr-xbin/upload-release-files.sh18
-rwxr-xr-xbin/xmlagenda.py6
12 files changed, 225 insertions, 463 deletions
diff --git a/bin/SConsDoc.py b/bin/SConsDoc.py
index cfb4e54..e44a8db 100644
--- a/bin/SConsDoc.py
+++ b/bin/SConsDoc.py
@@ -112,7 +112,6 @@ Tool example:
</tool>
"""
-import imp
import os.path
import re
import sys
@@ -156,8 +155,8 @@ if not has_etree:
except ImportError:
raise ImportError("Failed to import ElementTree from any known place")
-re_entity = re.compile("\&([^;]+);")
-re_entity_header = re.compile("<!DOCTYPE\s+sconsdoc\s+[^\]]+\]>")
+re_entity = re.compile(r"\&([^;]+);")
+re_entity_header = re.compile(r"<!DOCTYPE\s+sconsdoc\s+[^\]]+\]>")
# Namespace for the SCons Docbook XSD
dbxsd="http://www.scons.org/dbxsd/v1.0"
@@ -168,7 +167,7 @@ xsi = "http://www.w3.org/2001/XMLSchema-instance"
# Header comment with copyright
copyright_comment = """
-Copyright (c) 2001 - 2017 The SCons Foundation
+Copyright (c) 2001 - 2019 The SCons Foundation
This file is processed by the bin/SConsDoc.py module.
See its __doc__ string for a discussion of the format.
@@ -179,22 +178,21 @@ def isSConsXml(fpath):
contains the default target namespace definition.
"""
try:
- f = open(fpath,'r')
- content = f.read()
- f.close()
+ with open(fpath,'r') as f:
+ content = f.read()
if content.find('xmlns="%s"' % dbxsd) >= 0:
return True
except:
pass
-
- return False
+
+ return False
def remove_entities(content):
# Cut out entity inclusions
content = re_entity_header.sub("", content, re.M)
# Cut out entities themselves
content = re_entity.sub(lambda match: match.group(1), content)
-
+
return content
default_xsd = os.path.join('doc','xsd','scons.xsd')
@@ -202,11 +200,11 @@ default_xsd = os.path.join('doc','xsd','scons.xsd')
ARG = "dbscons"
class Libxml2ValidityHandler:
-
+
def __init__(self):
self.errors = []
self.warnings = []
-
+
def error(self, msg, data):
if data != ARG:
raise Exception("Error handler did not receive correct argument")
@@ -222,14 +220,14 @@ class DoctypeEntity:
def __init__(self, name_, uri_):
self.name = name_
self.uri = uri_
-
+
def getEntityString(self):
txt = """ <!ENTITY %(perc)s %(name)s SYSTEM "%(uri)s">
%(perc)s%(name)s;
""" % {'perc' : perc, 'name' : self.name, 'uri' : self.uri}
return txt
-
+
class DoctypeDeclaration:
def __init__(self, name_=None):
self.name = name_
@@ -242,23 +240,23 @@ class DoctypeDeclaration:
self.addEntity("functions-mod", "functions.mod")
self.addEntity("tools-mod", "tools.mod")
self.addEntity("variables-mod", "variables.mod")
-
+
def addEntity(self, name, uri):
self.entries.append(DoctypeEntity(name, uri))
-
+
def createDoctype(self):
content = '<!DOCTYPE %s [\n' % self.name
for e in self.entries:
content += e.getEntityString()
content += ']>\n'
-
+
return content
if not has_libxml2:
class TreeFactory:
def __init__(self):
pass
-
+
def newNode(self, tag):
return etree.Element(tag)
@@ -269,22 +267,22 @@ if not has_libxml2:
return etree.Element(tag, nsmap=NSMAP)
return etree.Element(tag)
-
+
def copyNode(self, node):
return copy.deepcopy(node)
-
+
def appendNode(self, parent, child):
parent.append(child)
def hasAttribute(self, node, att):
return att in node.attrib
-
+
def getAttribute(self, node, att):
return node.attrib[att]
-
+
def setAttribute(self, node, att, value):
node.attrib[att] = value
-
+
def getText(self, root):
return root.text
@@ -293,30 +291,27 @@ if not has_libxml2:
def writeGenTree(self, root, fp):
dt = DoctypeDeclaration()
- fp.write(etree.tostring(root, xml_declaration=True,
- encoding="UTF-8", pretty_print=True,
+ fp.write(etree.tostring(root, xml_declaration=True,
+ encoding="UTF-8", pretty_print=True,
doctype=dt.createDoctype()))
def writeTree(self, root, fpath):
- fp = open(fpath, 'w')
- fp.write(etree.tostring(root, xml_declaration=True,
- encoding="UTF-8", pretty_print=True))
- fp.close()
+ with open(fpath, 'w') as fp:
+ fp.write(etree.tostring(root, xml_declaration=True,
+ encoding="UTF-8", pretty_print=True))
def prettyPrintFile(self, fpath):
- fin = open(fpath,'r')
- tree = etree.parse(fin)
- pretty_content = etree.tostring(tree, pretty_print=True)
- fin.close()
-
- fout = open(fpath,'w')
- fout.write(pretty_content)
- fout.close()
+ with open(fpath,'r') as fin:
+ tree = etree.parse(fin)
+ pretty_content = etree.tostring(tree, pretty_print=True)
+
+ with open(fpath,'w') as fout:
+ fout.write(pretty_content)
def decorateWithHeader(self, root):
root.attrib["{"+xsi+"}schemaLocation"] = "%s %s/scons.xsd" % (dbxsd, dbxsd)
return root
-
+
def newXmlTree(self, root):
""" Return a XML file tree with the correct namespaces set,
the element root as top entry and the given header comment.
@@ -325,7 +320,7 @@ if not has_libxml2:
'xsi' : xsi}
t = etree.Element(root, nsmap=NSMAP)
return self.decorateWithHeader(t)
-
+
def validateXml(self, fpath, xmlschema_context):
# Use lxml
xmlschema = etree.XMLSchema(xmlschema_context)
@@ -362,21 +357,21 @@ if not has_libxml2:
current XML toolkit.
"""
return [root]
-
-else:
+
+else:
class TreeFactory:
def __init__(self):
pass
-
+
def newNode(self, tag):
return libxml2.newNode(tag)
def newEtreeNode(self, tag, init_ns=False):
return etree.Element(tag)
-
+
def copyNode(self, node):
return node.copyNode(1)
-
+
def appendNode(self, parent, child):
if hasattr(parent, 'addChild'):
parent.addChild(child)
@@ -387,7 +382,7 @@ else:
if hasattr(node, 'hasProp'):
return node.hasProp(att)
return att in node.attrib
-
+
def getAttribute(self, node, att):
if hasattr(node, 'prop'):
return node.prop(att)
@@ -398,7 +393,7 @@ else:
node.setProp(att, value)
else:
node.attrib[att] = value
-
+
def getText(self, root):
if hasattr(root, 'getContent'):
return root.getContent()
@@ -426,20 +421,18 @@ else:
doc.freeDoc()
def writeTree(self, root, fpath):
- fp = open(fpath, 'w')
- doc = libxml2.newDoc('1.0')
- doc.setRootElement(root)
- fp.write(doc.serialize("UTF-8", 1))
- doc.freeDoc()
- fp.close()
+ with open(fpath, 'w') as fp:
+ doc = libxml2.newDoc('1.0')
+ doc.setRootElement(root)
+ fp.write(doc.serialize("UTF-8", 1))
+ doc.freeDoc()
def prettyPrintFile(self, fpath):
# Read file and resolve entities
doc = libxml2.readFile(fpath, None, libxml2d.XML_PARSE_NOENT)
- fp = open(fpath, 'w')
- # Prettyprint
- fp.write(doc.serialize("UTF-8", 1))
- fp.close()
+ with open(fpath, 'w') as fp:
+ # Prettyprint
+ fp.write(doc.serialize("UTF-8", 1))
# Cleanup
doc.freeDoc()
@@ -448,9 +441,9 @@ else:
ns = root.newNs(dbxsd, None)
xi = root.newNs(xsi, 'xsi')
root.setNs(ns) #put this node in the target namespace
-
+
root.setNsProp(xi, 'schemaLocation', "%s %s/scons.xsd" % (dbxsd, dbxsd))
-
+
return root
def newXmlTree(self, root):
@@ -461,6 +454,8 @@ else:
return self.decorateWithHeader(t)
def validateXml(self, fpath, xmlschema_context):
+ retval = True
+
# Create validation context
validation_context = xmlschema_context.schemaNewValidCtxt()
# Set error/warning handlers
@@ -470,17 +465,19 @@ else:
doc = libxml2.readFile(fpath, None, libxml2.XML_PARSE_NOENT)
doc.xincludeProcessFlags(libxml2.XML_PARSE_NOENT)
err = validation_context.schemaValidateDoc(doc)
- # Cleanup
- doc.freeDoc()
- del validation_context
-
+
if err or eh.errors:
for e in eh.errors:
print(e.rstrip("\n"))
+ # import pdb; pdb.set_trace()
print("%s fails to validate" % fpath)
- return False
-
- return True
+ retval = False
+
+ # Cleanup
+ doc.freeDoc()
+ del validation_context
+
+ return retval
def findAll(self, root, tag, ns=None, xpath_context=None, nsmap=None):
if hasattr(root, 'xpathEval') and xpath_context:
@@ -503,7 +500,7 @@ else:
expression = "./%s/node()" % tag
if ns:
expression = "./%s:%s/node()" % (ns, tag)
-
+
return xpath_context.xpathEval(expression)
else:
expression = "./{%s}%s/node()" % (nsmap[ns], tag)
@@ -533,7 +530,7 @@ else:
if child.tail:
tail = libxml2.newText(child.tail)
elements.append(tail)
-
+
return elements
def convertElementTree(self, root):
@@ -559,7 +556,7 @@ else:
if root.tail:
tail = libxml2.newText(root.tail)
elements.append(tail)
-
+
return elements
tf = TreeFactory()
@@ -600,7 +597,7 @@ class SConsDocTree:
# Register namespaces
for key, val in self.nsmap.items():
self.xpath_context.xpathRegisterNs(key, val)
-
+
def __del__(self):
if self.doc is not None:
self.doc.freeDoc()
@@ -619,7 +616,7 @@ def validate_all_xml(dpaths, xsdfile=default_xsd):
ctxt = libxml2.schemaNewParserCtxt(xsdfile)
xmlschema_context = ctxt.schemaParse()
del ctxt
-
+
fpaths = []
for dp in dpaths:
if dp.endswith('.xml') and isSConsXml(dp):
@@ -632,13 +629,13 @@ def validate_all_xml(dpaths, xsdfile=default_xsd):
fp = os.path.join(path, f)
if isSConsXml(fp):
fpaths.append(fp)
-
+
fails = []
for idx, fp in enumerate(fpaths):
fpath = os.path.join(path, fp)
print("%.2f%s (%d/%d) %s" % (float(idx+1)*100.0/float(len(fpaths)),
perc, idx+1, len(fpaths),fp))
-
+
if not tf.validateXml(fp, xmlschema_context):
fails.append(fp)
continue
@@ -649,7 +646,7 @@ def validate_all_xml(dpaths, xsdfile=default_xsd):
if fails:
return False
-
+
return True
class Item(object):
@@ -730,10 +727,10 @@ class SConsDocHandler(object):
uses.extend(self.parseItems(u, xpath_context, nsmap))
for s in tf.findAll(domelem, "sets", dbxid, xpath_context, nsmap):
sets.extend(self.parseItems(s, xpath_context, nsmap))
-
+
return sorted(uses), sorted(sets)
- def parseInstance(self, domelem, map, Class,
+ def parseInstance(self, domelem, map, Class,
xpath_context, nsmap, include_entities=True):
name = 'unknown'
if tf.hasAttribute(domelem, 'name'):
@@ -757,24 +754,24 @@ class SConsDocHandler(object):
instance.arguments = []
instance.arguments.append(tf.copyNode(a))
- def parseDomtree(self, root, xpath_context=None, nsmap=None, include_entities=True):
+ def parseDomtree(self, root, xpath_context=None, nsmap=None, include_entities=True):
# Process Builders
for b in tf.findAll(root, "builder", dbxid, xpath_context, nsmap):
- self.parseInstance(b, self.builders, Builder,
+ self.parseInstance(b, self.builders, Builder,
xpath_context, nsmap, include_entities)
# Process Functions
for f in tf.findAll(root, "scons_function", dbxid, xpath_context, nsmap):
- self.parseInstance(f, self.functions, Function,
+ self.parseInstance(f, self.functions, Function,
xpath_context, nsmap, include_entities)
# Process Tools
for t in tf.findAll(root, "tool", dbxid, xpath_context, nsmap):
- self.parseInstance(t, self.tools, Tool,
+ self.parseInstance(t, self.tools, Tool,
xpath_context, nsmap, include_entities)
# Process CVars
for c in tf.findAll(root, "cvar", dbxid, xpath_context, nsmap):
- self.parseInstance(c, self.cvars, ConstructionVariable,
+ self.parseInstance(c, self.cvars, ConstructionVariable,
xpath_context, nsmap, include_entities)
-
+
def parseContent(self, content, include_entities=True):
""" Parses the given content as XML file. This method
is used when we generate the basic lists of entities
@@ -795,27 +792,48 @@ class SConsDocHandler(object):
t.parseXmlFile(fpath)
# Parse it
self.parseDomtree(t.root, t.xpath_context, t.nsmap)
-
+
# lifted from Ka-Ping Yee's way cool pydoc module.
-def importfile(path):
- """Import a Python source file or compiled file given its path."""
- magic = imp.get_magic()
- file = open(path, 'r')
- if file.read(len(magic)) == magic:
- kind = imp.PY_COMPILED
- else:
- kind = imp.PY_SOURCE
- file.close()
- filename = os.path.basename(path)
- name, ext = os.path.splitext(filename)
- file = open(path, 'r')
- try:
- module = imp.load_module(name, file, path, (ext, 'r', kind))
- except ImportError as e:
- sys.stderr.write("Could not import %s: %s\n" % (path, e))
- return None
- file.close()
- return module
+if sys.version_info[0] == 2:
+ def importfile(path):
+ """Import a Python source file or compiled file given its path."""
+ import imp
+ magic = imp.get_magic()
+ with open(path, 'r') as ifp:
+ if ifp.read(len(magic)) == magic:
+ kind = imp.PY_COMPILED
+ else:
+ kind = imp.PY_SOURCE
+ filename = os.path.basename(path)
+ name, ext = os.path.splitext(filename)
+ with open(path, 'r') as ifp:
+ try:
+ module = imp.load_module(name, ifp, path, (ext, 'r', kind))
+ except ImportError as e:
+ sys.stderr.write("Could not import %s: %s\n" % (path, e))
+ return None
+ return module
+
+else: # PY3 version, from newer pydoc
+ def importfile(path):
+ """Import a Python source file or compiled file given its path."""
+ import importlib
+ from pydoc import ErrorDuringImport
+ magic = importlib.util.MAGIC_NUMBER
+ with open(path, 'rb') as ifp:
+ is_bytecode = magic == ifp.read(len(magic))
+ filename = os.path.basename(path)
+ name, ext = os.path.splitext(filename)
+ if is_bytecode:
+ loader = importlib._bootstrap_external.SourcelessFileLoader(name, path)
+ else:
+ loader = importlib._bootstrap_external.SourceFileLoader(name, path)
+ # XXX We probably don't need to pass in the loader here.
+ spec = importlib.util.spec_from_file_location(name, path, loader=loader)
+ try:
+ return importlib._bootstrap._load(spec)
+ except:
+ raise ErrorDuringImport(path, sys.exc_info())
# Local Variables:
# tab-width:4
diff --git a/bin/SConsExamples.py b/bin/SConsExamples.py
index 50c4c1a..7491c58 100644
--- a/bin/SConsExamples.py
+++ b/bin/SConsExamples.py
@@ -39,7 +39,7 @@
# env.Program('foo')
# </file>
# <file name="foo.c">
-# int main() { printf("foo.c\n"); }
+# int main(void) { printf("foo.c\n"); }
# </file>
# </scons_example>
#
@@ -305,6 +305,11 @@ def createAllExampleOutputs(dpath):
examples = readAllExampleInfos(dpath)
total = len(examples)
idx = 0
+
+ if len(sys.argv) > 1:
+ examples_to_run = sys.argv[1:]
+ examples = { k:v for k,v in examples.items() if k in examples_to_run }
+
for key, value in examples.items():
# Process all scons_output tags
print("%.2f%s (%d/%d) %s" % (float(idx + 1) * 100.0 / float(total),
@@ -411,8 +416,8 @@ def exampleNamesAreUnique(dpath):
#
# ###############################################################
-sys.path.append(os.path.join(os.getcwd(), 'QMTest'))
-sys.path.append(os.path.join(os.getcwd(), 'build', 'QMTest'))
+sys.path.append(os.path.join(os.getcwd(), 'testing/framework'))
+sys.path.append(os.path.join(os.getcwd(), 'build', 'testing/framework'))
scons_py = os.path.join('bootstrap', 'src', 'script', 'scons.py')
if not os.path.exists(scons_py):
@@ -657,21 +662,27 @@ SConscript('SConstruct')
"""
# "Commands" that we will execute in our examples.
-def command_scons(args, c, test, dict):
+def command_scons(args, command, test, values):
+ """
+ Fake scons command
+ """
save_vals = {}
delete_keys = []
try:
- ce = c.environment
+ ce = command.environment
except AttributeError:
pass
else:
- for arg in c.environment.split():
+ for arg in command.environment.split():
key, val = arg.split('=')
try:
save_vals[key] = os.environ[key]
except KeyError:
delete_keys.append(key)
os.environ[key] = val
+
+ test.write(test.workpath('WORK/SConstruct_created'), Stdin % values)
+
test.run(interpreter=sys.executable,
program=scons_py,
# We use ToolSurrogates to capture win32 output by "building"
@@ -681,7 +692,7 @@ def command_scons(args, c, test, dict):
# Visual C installed.
arguments='--warn=no-visual-c-missing -f - ' + ' '.join(args),
chdir=test.workpath('WORK'),
- stdin=Stdin % dict)
+ stdin=Stdin % values)
os.environ.update(save_vals)
for key in delete_keys:
del(os.environ[key])
@@ -698,7 +709,7 @@ def command_scons(args, c, test, dict):
# sys.stderr.write(err)
return lines
-def command_touch(args, c, test, dict):
+def command_touch(args, command, test, values):
if args[0] == '-t':
t = int(time.mktime(time.strptime(args[1], '%Y%m%d%H%M')))
times = (t, t)
@@ -714,7 +725,7 @@ def command_touch(args, c, test, dict):
os.utime(file, times)
return []
-def command_edit(args, c, test, dict):
+def command_edit(args, c, test, values):
if c.edit is None:
add_string = 'void edit(void) { ; }\n'
else:
@@ -728,7 +739,7 @@ def command_edit(args, c, test, dict):
open(file, 'wb').write(contents + add_string)
return []
-def command_ls(args, c, test, dict):
+def command_ls(args, c, test, values):
def ls(a):
try:
return [' '.join(sorted([x for x in os.listdir(a) if x[0] != '.']))]
@@ -743,7 +754,7 @@ def command_ls(args, c, test, dict):
else:
return ls(test.workpath('WORK'))
-def command_sleep(args, c, test, dict):
+def command_sleep(args, c, test, values):
time.sleep(int(args[0]))
CommandDict = {
@@ -754,17 +765,19 @@ CommandDict = {
'sleep' : command_sleep,
}
-def ExecuteCommand(args, c, t, dict):
+def ExecuteCommand(args, c, t, values):
try:
func = CommandDict[args[0]]
except KeyError:
- func = lambda args, c, t, dict: []
- return func(args[1:], c, t, dict)
+ func = lambda args, c, t, values: []
+ return func(args[1:], c, t, values)
def create_scons_output(e):
- # The real raison d'etre for this script, this is where we
- # actually execute SCons to fetch the output.
+ """
+ The real raison d'etre for this script, this is where we
+ actually execute SCons to fetch the output.
+ """
# Loop over all outputs for the example
for o in e.outputs:
@@ -837,37 +850,37 @@ def create_scons_output(e):
sroot = stf.newEtreeNode("screen", True)
curchild = None
content = ""
- for c in o.commands:
+ for command in o.commands:
content += Prompt[o.os]
if curchild is not None:
- if not c.output:
+ if not command.output:
# Append content as tail
curchild.tail = content
content = "\n"
# Add new child for userinput tag
curchild = stf.newEtreeNode("userinput")
- d = c.cmd.replace('__ROOT__', '')
+ d = command.cmd.replace('__ROOT__', '')
curchild.text = d
sroot.append(curchild)
else:
- content += c.output + '\n'
+ content += command.output + '\n'
else:
- if not c.output:
+ if not command.output:
# Add first text to root
sroot.text = content
content = "\n"
# Add new child for userinput tag
curchild = stf.newEtreeNode("userinput")
- d = c.cmd.replace('__ROOT__', '')
+ d = command.cmd.replace('__ROOT__', '')
curchild.text = d
sroot.append(curchild)
else:
- content += c.output + '\n'
+ content += command.output + '\n'
# Execute command and capture its output
- cmd_work = c.cmd.replace('__ROOT__', t.workpath('ROOT'))
+ cmd_work = command.cmd.replace('__ROOT__', t.workpath('ROOT'))
args = cmd_work.split()
- lines = ExecuteCommand(args, c, t, {'osname':o.os, 'tools':o.tools})
- if not c.output and lines:
+ lines = ExecuteCommand(args, command, t, {'osname':o.os, 'tools':o.tools})
+ if not command.output and lines:
ncontent = '\n'.join(lines)
ncontent = address_re.sub(r' at 0x700000&gt;', ncontent)
ncontent = engine_re.sub(r' File "bootstrap/src/engine/SCons/', ncontent)
diff --git a/bin/import-test.py b/bin/import-test.py
index 168208f..2290edd 100644
--- a/bin/import-test.py
+++ b/bin/import-test.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
-# Copyright (c) 2001 - 2017 The SCons Foundation
+# Copyright (c) 2001 - 2019 The SCons Foundation
#
# tree2test.py - turn a directory tree into TestSCons code
#
@@ -25,7 +25,7 @@
# """ triple-quotes will need to have their contents edited by hand.
#
-__revision__ = "bin/import-test.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
+__revision__ = "bin/import-test.py e724ae812eb96f4858a132f5b8c769724744faf6 2019-07-21 00:04:47 bdeegan"
import os.path
import sys
diff --git a/bin/linecount.py b/bin/linecount.py
index 75723d0..8f9973f 100644
--- a/bin/linecount.py
+++ b/bin/linecount.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
-# Copyright (c) 2001 - 2017 The SCons Foundation
+# Copyright (c) 2001 - 2019 The SCons Foundation
#
# Count statistics about SCons test and source files. This must be run
# against a fully-populated tree (for example, one that's been freshly
@@ -23,7 +23,7 @@
# interesting one for most purposes.
from __future__ import division, print_function
-__revision__ = "bin/linecount.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
+__revision__ = "bin/linecount.py e724ae812eb96f4858a132f5b8c769724744faf6 2019-07-21 00:04:47 bdeegan"
import os.path
diff --git a/bin/restore.sh b/bin/restore.sh
index 49c95bc..c8db2c0 100644
--- a/bin/restore.sh
+++ b/bin/restore.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env sh
#
-# Simple hack script to restore __revision__, __COPYRIGHT_, 3.0.0
+# Simple hack script to restore __revision__, __COPYRIGHT_, 3.1.0
# and other similar variables to what gets checked in to source. This
# comes in handy when people send in diffs based on the released source.
#
@@ -22,9 +22,9 @@ header() {
for i in `find $DIRS -name '*.py'`; do
header $i
ed $i <<EOF
-g/Copyright (c) 2001.*SCons Foundation/s//Copyright (c) 2001 - 2017 The SCons Foundation/p
+g/Copyright (c) 2001.*SCons Foundation/s//Copyright (c) 2001 - 2019 The SCons Foundation/p
w
-/^__revision__ = /s/= .*/= "bin/restore.sh rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"/p
+/^__revision__ = /s/= .*/= "bin/restore.sh e724ae812eb96f4858a132f5b8c769724744faf6 2019-07-21 00:04:47 bdeegan"/p
w
q
EOF
@@ -33,9 +33,9 @@ done
for i in `find $DIRS -name 'scons.bat'`; do
header $i
ed $i <<EOF
-g/Copyright (c) 2001.*SCons Foundation/s//Copyright (c) 2001 - 2017 The SCons Foundation/p
+g/Copyright (c) 2001.*SCons Foundation/s//Copyright (c) 2001 - 2019 The SCons Foundation/p
w
-/^@REM src\/script\/scons.bat/s/@REM .* knight/@REM bin/restore.sh rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog/p
+/^@REM src\/script\/scons.bat/s/@REM .* knight/@REM bin/restore.sh e724ae812eb96f4858a132f5b8c769724744faf6 2019-07-21 00:04:47 bdeegan/p
w
q
EOF
@@ -44,15 +44,15 @@ done
for i in `find $DIRS -name '__init__.py' -o -name 'scons.py' -o -name 'sconsign.py'`; do
header $i
ed $i <<EOF
-/^__version__ = /s/= .*/= "3.0.0"/p
+/^__version__ = /s/= .*/= "3.1.0"/p
w
-/^__build__ = /s/= .*/= "rel_3.0.0:4395:8972f6a2f699"/p
+/^__build__ = /s/= .*/= "e724ae812eb96f4858a132f5b8c769724744faf6"/p
w
-/^__buildsys__ = /s/= .*/= "ubuntu-16"/p
+/^__buildsys__ = /s/= .*/= "kufra"/p
w
-/^__date__ = /s/= .*/= "2017/09/18 12:59:24"/p
+/^__date__ = /s/= .*/= "2019-07-21 00:04:47"/p
w
-/^__developer__ = /s/= .*/= "bdbaddog"/p
+/^__developer__ = /s/= .*/= "bdeegan"/p
w
q
EOF
@@ -61,7 +61,7 @@ done
for i in `find $DIRS -name 'setup.py'`; do
header $i
ed $i <<EOF
-/^ *version = /s/= .*/= "3.0.0",/p
+/^ *version = /s/= .*/= "3.1.0",/p
w
q
EOF
@@ -70,11 +70,11 @@ done
for i in `find $DIRS -name '*.txt'`; do
header $i
ed $i <<EOF
-g/Copyright (c) 2001.*SCons Foundation/s//Copyright (c) 2001 - 2017 The SCons Foundation/p
+g/Copyright (c) 2001.*SCons Foundation/s//Copyright (c) 2001 - 2019 The SCons Foundation/p
w
-/# [^ ]* 0.96.[CD][0-9]* [0-9\/]* [0-9:]* knight$/s/.*/# bin/restore.sh rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog/p
+/# [^ ]* 0.96.[CD][0-9]* [0-9\/]* [0-9:]* knight$/s/.*/# bin/restore.sh e724ae812eb96f4858a132f5b8c769724744faf6 2019-07-21 00:04:47 bdeegan/p
w
-/Version [0-9][0-9]*\.[0-9][0-9]*/s//Version 3.0.0/p
+/Version [0-9][0-9]*\.[0-9][0-9]*/s//Version 3.1.0/p
w
q
EOF
@@ -83,7 +83,7 @@ done
for i in `find $DIRS -name '*.xml'`; do
header $i
ed $i <<EOF
-g/Copyright (c) 2001.*SCons Foundation/s//Copyright (c) 2001 - 2017 The SCons Foundation/p
+g/Copyright (c) 2001.*SCons Foundation/s//Copyright (c) 2001 - 2019 The SCons Foundation/p
w
q
EOF
diff --git a/bin/scons-cdist b/bin/scons-cdist
deleted file mode 100644
index 58b1bae..0000000
--- a/bin/scons-cdist
+++ /dev/null
@@ -1,272 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2005 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-PROG=`basename $0`
-NOARGFLAGS="afhlnqrstz"
-ARGFLAGS="p:"
-ALLFLAGS="${NOARGFLAGS}${ARGFLAGS}"
-USAGE="Usage: ${PROG} [-${NOARGFLAGS}] [-p project] change"
-
-HELP="$USAGE
-
- -a Update the latest Aegis baseline (aedist) file.
- -f Force update, skipping up-front sanity check.
- -h Print this help message and exit.
- -l Update the local CVS repository.
- -n Don't execute, just echo commands.
- -p project Set the Aegis project.
- -q Quiet, don't print commands before executing them.
- -r Rsync the Aegis repository to SourceForge.
- -s Update the sourceforge.net CVS repository.
- -t Update the tigris.org CVS repository.
- -z Update the latest .tar.gz and .zip files.
-"
-
-DO=""
-PRINT="echo"
-EXECUTE="eval"
-SANITY_CHECK="yes"
-
-while getopts $ALLFLAGS FLAG; do
- case $FLAG in
- a | l | r | s | t | z )
- DO="${DO}${FLAG}"
- ;;
- f )
- SANITY_CHECK="no"
- ;;
- h )
- echo "${HELP}"
- exit 0
- ;;
- n )
- EXECUTE=":"
- ;;
- p )
- AEGIS_PROJECT="${OPTARG}"
- ;;
- q )
- PRINT=":"
- ;;
- * )
- echo "FLAG = ${FLAG}" >&2
- echo "${USAGE}" >&2
- exit 1
- ;;
- esac
-done
-
-shift `expr ${OPTIND} - 1`
-
-if test "X$1" = "X"; then
- echo "${USAGE}" >&2
- exit 1
-fi
-
-if test "X${AEGIS_PROJECT}" = "X"; then
- echo "$PROG: No AEGIS_PROJECT set." >&2
- echo "${USAGE}" >&2
- exit 1
-fi
-
-if test "X$DO" = "X"; then
- DO="alrstz"
-fi
-
-cmd()
-{
- $PRINT "$*"
- $EXECUTE "$*"
-}
-
-CHANGE=$1
-
-if test "X${SANITY_CHECK}" = "Xyes"; then
- SCM="cvs"
- SCMROOT="/home/scons/CVSROOT/scons"
- DELTA=`aegis -l -ter cd ${CHANGE} | sed -n 's/.*, Delta \([0-9]*\)\./\1/p'`
- if test "x${DELTA}" = "x"; then
- echo "${PROG}: Could not find delta for change ${CHANGE}." >&2
- echo "Has this finished integrating? Change ${CHANGE} not distributed." >&2
- exit 1
- fi
- PREV_DELTA=`expr ${DELTA} - 1`
- COMMAND="scons-scmcheck -D ${PREV_DELTA} -d q -p ${AEGIS_PROJECT} -s ${SCM} ${SCMROOT}"
- $PRINT "${COMMAND}"
- OUTPUT=`${COMMAND}`
- if test "X${OUTPUT}" != "X"; then
- echo "${PROG}: ${SCMROOT} is not up to date:" >&2
- echo "${OUTPUT}" >& 2
- echo "Did you skip any changes? Change ${CHANGE} not distributed." >&2
- exit 1
- fi
-fi
-
-if test X$EXECUTE != "X:" -a "X$SSH_AGENT_PID" = "X"; then
- eval `ssh-agent`
- ssh-add
- trap 'eval `ssh-agent -k`; exit' 0 1 2 3 15
-fi
-
-cd
-
-BASELINE=`aesub -p ${AEGIS_PROJECT} -c ${CHANGE} '${Project trunk_name}'`
-
-TMPBLAE="/tmp/${BASELINE}.ae"
-TMPCAE="/tmp/${AEGIS_PROJECT}.C${CHANGE}.ae"
-
-# Original values for SourceForge.
-#SFLOGIN="stevenknight"
-#SFHOST="scons.sourceforge.net"
-#SFDEST="/home/groups/s/sc/scons/htdocs"
-
-SCONSLOGIN="scons"
-SCONSHOST="manam.pair.com"
-#SCONSDEST="public_html/production"
-SCONSDEST="public_ftp"
-
-#
-# Copy the baseline .ae to the constant location on SourceForge.
-#
-case "${DO}" in
-*a* )
- cmd "aedist -s -bl -p ${AEGIS_PROJECT} > ${TMPBLAE}"
- cmd "scp ${TMPBLAE} ${SCONSLOGIN}@${SCONSHOST}:${SCONSDEST}/${BASELINE}.ae"
- cmd "rm ${TMPBLAE}"
- ;;
-esac
-
-#
-# Copy the latest .tar.gz and .zip files to the constant location on
-# SourceForge.
-#
-case "${DO}" in
-*z* )
- BUILD_DIST=`aegis -p ${AEGIS_PROJECT} -cd -bl`/build/dist
- SCONS_SRC_TAR_GZ=`echo ${AEGIS_PROJECT} | sed 's/scons./scons-src-/'`*.tar.gz
- SCONS_SRC_ZIP=`echo ${AEGIS_PROJECT} | sed 's/scons./scons-src-/'`*.zip
- cmd "scp ${BUILD_DIST}/${SCONS_SRC_TAR_GZ} ${SCONSLOGIN}@${SCONSHOST}:${SCONSDEST}/scons-src-latest.tar.gz"
- cmd "scp ${BUILD_DIST}/${SCONS_SRC_ZIP} ${SCONSLOGIN}@${SCONSHOST}:${SCONSDEST}/scons-src-latest.zip"
-esac
-
-#
-# Sync Aegis tree with SourceForge.
-#
-# Cribbed and modified from Peter Miller's same-named script in
-# /home/groups/a/ae/aegis/aegis at SourceForge.
-#
-# Guide to what this does with rsync:
-#
-# --rsh=ssh use ssh for the transfer
-# -l copy symlinks as symlinks
-# -p preserve permissions
-# -r recursive
-# -t preserve times
-# -z compress data
-# --stats file transfer statistics
-# --exclude exclude files matching the pattern
-# --delete delete files that don't exist locally
-# --delete-excluded delete files that match the --exclude patterns
-# --progress show progress during the transfer
-# -v verbose
-#
-# We no longer use the --stats option.
-#
-case "${DO}" in
-*r* )
- LOCAL=/home/scons/scons
- REMOTE=/home/groups/s/sc/scons/scons
- cmd "/usr/bin/rsync --rsh='ssh -l stevenknight' \
- -l -p -r -t -z \
- --exclude build \
- --exclude '*,D' \
- --exclude '*.pyc' \
- --exclude aegis.log \
- --exclude '.sconsign*' \
- --delete --delete-excluded \
- --progress -v \
- ${LOCAL}/. scons.sourceforge.net:${REMOTE}/."
- ;;
-esac
-
-#
-# Sync the CVS tree with the local repository.
-#
-case "${DO}" in
-*l* )
- (
- export CVSROOT=/home/scons/CVSROOT/scons
- #cmd "ae2cvs -X -aegis -p ${AEGIS_PROJECT} -c ${CHANGE} -u $HOME/SCons/baldmt.com/scons"
- cmd "ae-cvs-ci ${AEGIS_PROJECT} ${CHANGE}"
- )
- ;;
-esac
-
-#
-# Sync the Subversion tree with Tigris.org.
-#
-case "${DO}" in
-*t* )
- (
- SVN=http://scons.tigris.org/svn/scons
- case ${AEGIS_PROJECT} in
- scons.0.96 )
- SVN_URL=${SVN}/branches/core
- ;;
- scons.0.96.513 )
- SVN_URL=${SVN}/branches/sigrefactor
- ;;
- * )
- echo "$PROG: Don't know SVN branch for '${AEGIS_PROJECT}'" >&2
- exit 1
- ;;
- esac
- SVN_CO_FLAGS="--username stevenknight"
- #cmd "ae2cvs -X -aegis -p ${AEGIS_PROJECT} -c ${CHANGE} -u $HOME/SCons/tigris.org/scons"
- cmd "ae-svn-ci ${AEGIS_PROJECT} ${CHANGE} ${SVN_URL} ${SVN_CO_FLAGS}"
- )
- ;;
-esac
-
-#
-# Sync the CVS tree with SourceForge.
-#
-case "${DO}" in
-*s* )
- (
- export CVS_RSH=ssh
- export CVSROOT=:ext:stevenknight@scons.cvs.sourceforge.net:/cvsroot/scons
- #cmd "ae2cvs -X -aegis -p ${AEGIS_PROJECT} -c ${CHANGE} -u $HOME/SCons/sourceforge.net/scons"
- cmd "ae-cvs-ci ${AEGIS_PROJECT} ${CHANGE}"
- )
- ;;
-esac
-
-#
-# Send the change .ae to the scons-aedist mailing list
-#
-# The subject requires editing by hand...
-#
-#aedist -s -p ${AEGIS_PROJECT} ${CHANGE} > ${TMPCAE}
-#aegis -l -p ${AEGIS_PROJECT} -c ${CHANGE} cd |
-# pine -attach_and_delete ${TMPCAE} scons-aedist@lists.sourceforge.net
diff --git a/bin/scons-test.py b/bin/scons-test.py
index dd54dd1..d4ddfc9 100644
--- a/bin/scons-test.py
+++ b/bin/scons-test.py
@@ -18,7 +18,6 @@ from __future__ import print_function
import atexit
import getopt
-import imp
import os
import os.path
import sys
diff --git a/bin/scons_dev_master.py b/bin/scons_dev_master.py
index 3d67cb5..4b1160f 100644
--- a/bin/scons_dev_master.py
+++ b/bin/scons_dev_master.py
@@ -11,11 +11,12 @@ import sys
from Command import CommandRunner, Usage
INITIAL_PACKAGES = [
- 'mercurial',
+ 'git',
]
INSTALL_PACKAGES = [
'wget',
+ 'xz-utils',
]
PYTHON_PACKAGES = [
@@ -41,6 +42,7 @@ BUILDING_PACKAGES = [
'python-epydoc',
'rpm',
'tar',
+ 'lynx'
# additional packages that Bill Deegan's web page suggests
#'docbook-to-man',
@@ -60,8 +62,7 @@ DOCUMENTATION_PACKAGES = [
'gcc-doc',
'pkg-config',
'python-doc',
- 'sun-java5-doc',
- 'sun-java6-doc',
+ 'openjdk-8-doc',
'swig-doc',
'texlive-doc',
]
@@ -73,18 +74,20 @@ TESTING_PACKAGES = [
'flex',
'g++',
'gcc',
- 'gcj',
+ # not on ubuntu 18.04
+ # 'gcj',
+ # 'hg',
'ghostscript',
-# 'libgcj7-dev',
'm4',
'openssh-client',
'openssh-server',
'python-profiler',
'python-all-dev',
+ 'python3-all-dev',
+ 'pypy-dev',
'rcs',
'rpm',
-# 'sun-java5-jdk',
- 'sun-java6-jdk',
+ 'openjdk-8-jdk',
'swig',
'texlive-base-bin',
'texlive-extra-utils',
@@ -131,7 +134,7 @@ Usage: scons_dev_master.py [-hnqy] [--password PASSWORD] [--username USER]
buildbot Install packages for running BuildBot
"""
- scons_url = 'https://bdbaddog@bitbucket.org/scons/scons'
+ scons_url = 'https://github.com/SCons/scons.git'
sudo = 'sudo'
password = '""'
username = 'guest'
@@ -180,13 +183,15 @@ Usage: scons_dev_master.py [-hnqy] [--password PASSWORD] [--username USER]
cmd.run('%(sudo)s apt-get %(yesflag)s upgrade')
elif arg == 'checkout':
cmd.run('%(sudo)s apt-get %(yesflag)s install %(initial_packages)s')
- cmd.run('hg clone" %(scons_url)s')
+ cmd.run('git clone" %(scons_url)s')
elif arg == 'building':
cmd.run('%(sudo)s apt-get %(yesflag)s install %(building_packages)s')
elif arg == 'docs':
cmd.run('%(sudo)s apt-get %(yesflag)s install %(doc_packages)s')
elif arg == 'testing':
cmd.run('%(sudo)s apt-get %(yesflag)s install %(testing_packages)s')
+ #TODO: maybe copy ipkg-build from openwrt git
+ #cmd.run('%(sudo)s wget https://raw.githubusercontent.com/openwrt/openwrt/master/scripts/ipkg-build SOMEWHERE')
elif arg == 'buildbot':
cmd.run('%(sudo)s apt-get %(yesflag)s install %(buildbot_packages)s')
elif arg == 'python-versions':
diff --git a/bin/time-scons.py b/bin/time-scons.py
index b7d8ef1..c5cd0cc 100644
--- a/bin/time-scons.py
+++ b/bin/time-scons.py
@@ -43,7 +43,7 @@ TimeSCons_revision = 4569
# The pieces of the TimeSCons infrastructure that are necessary to
# produce consistent timings, even when the rest of the tree is from
# an earlier revision that doesn't have these pieces.
-TimeSCons_pieces = ['QMTest', 'timings', 'runtest.py']
+TimeSCons_pieces = ['testing/framework', 'timings', 'runtest.py']
class CommandRunner(object):
diff --git a/bin/update-release-info.py b/bin/update-release-info.py
index a4096d1..c2b3d19 100644
--- a/bin/update-release-info.py
+++ b/bin/update-release-info.py
@@ -20,10 +20,10 @@ in various files:
- The RELEASE header line in src/CHANGES.txt and src/Announce.txt.
- The version string at the top of src/RELEASE.txt.
- The version string in the 'default_version' variable in SConstruct
- and QMTest/TestSCons.py.
- - The copyright years in SConstruct and QMTest/TestSCons.py.
+ and testing/framework/TestSCons.py.
+ - The copyright years in SConstruct and testing/framework/TestSCons.py.
- The month and year (used for documentation) in SConstruct.
- - The unsupported and deprecated Python floors in QMTest/TestSCons.py
+ - The unsupported and deprecated Python floors in testing/framework/TestSCons.py
and src/engine/SCons/Script/Main.py
- The version string in the filenames in README.
@@ -36,7 +36,7 @@ In 'post' mode, files are prepared for the next release cycle:
src/Announce.txt.
"""
#
-# Copyright (c) 2001 - 2017 The SCons Foundation
+# Copyright (c) 2001 - 2019 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -58,7 +58,7 @@ In 'post' mode, files are prepared for the next release cycle:
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from __future__ import print_function
-__revision__ = "bin/update-release-info.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
+__revision__ = "bin/update-release-info.py e724ae812eb96f4858a132f5b8c769724744faf6 2019-07-21 00:04:47 bdeegan"
import os
import sys
@@ -81,7 +81,10 @@ else:
# Get configuration information
config = dict()
-exec(open('ReleaseConfig').read(), globals(), config)
+with open('ReleaseConfig') as f:
+ releaseconfig = f.read()
+exec(releaseconfig, globals(), config)
+
try:
version_tuple = config['version_tuple']
@@ -152,7 +155,8 @@ class UpdateFile(object):
'''
if orig is None: orig = file
try:
- self.content = open(orig, 'r').read()
+ with open(orig, 'r') as f:
+ self.content = f.read()
except IOError:
# Couldn't open file; don't try to write anything in __del__
self.file = None
@@ -180,8 +184,8 @@ class UpdateFile(object):
# Determine the pattern to match a version
- _rel_types = '(alpha|beta|candidate|final)'
- match_pat = '\d+\.\d+\.\d+\.' + _rel_types + '\.(\d+|yyyymmdd)'
+ _rel_types = r'(alpha|beta|candidate|final)'
+ match_pat = r'\d+\.\d+\.\d+\.' + _rel_types + r'\.(\d+|yyyymmdd)'
match_rel = re.compile(match_pat)
def replace_version(self, replacement = version_string, count = 1):
@@ -198,14 +202,14 @@ class UpdateFile(object):
new_date = 'NEW DATE WILL BE INSERTED HERE'
else:
min = (time.daylight and time.altzone or time.timezone)//60
- hr = min//60
- min = -(min%60 + hr*100)
+ hr = min // 60
+ min = -(min % 60 + hr * 100)
new_date = (time.strftime('%a, %d %b %Y %X', release_date + (0,0,0))
+ ' %+.4d' % min)
- _days = '(Sun|Mon|Tue|Wed|Thu|Fri|Sat)'
- _months = '(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oce|Nov|Dec)'
- match_date = _days+', \d\d '+_months+' \d\d\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d'
+ _days = r'(Sun|Mon|Tue|Wed|Thu|Fri|Sat)'
+ _months = r'(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oce|Nov|Dec)'
+ match_date = r''.join([_days, r', \d\d ', _months, r' \d\d\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d'])
match_date = re.compile(match_date)
def replace_date(self, replacement = new_date, count = 1):
@@ -220,7 +224,8 @@ class UpdateFile(object):
'''
if self.file is not None and self.content != self.orig:
print('Updating ' + self.file + '...')
- open(self.file, 'w').write(self.content)
+ with open(self.file, 'w') as f:
+ f.write(self.content)
if mode == 'post':
# Set up for the next release series.
@@ -309,15 +314,15 @@ t.replace_assign('default_version', repr(version_string))
t = UpdateFile('README.rst')
if DEBUG: t.file = '/tmp/README.rst'
-t.sub('-' + t.match_pat + '\.', '-' + version_string + '.', count = 0)
+t.sub('-' + t.match_pat + r'\.', '-' + version_string + '.', count = 0)
for suf in ['tar', 'win32', 'zip', 'rpm', 'exe', 'deb']:
- t.sub('-(\d+\.\d+\.\d+)\.%s' % suf,
+ t.sub(r'-(\d+\.\d+\.\d+)\.%s' % suf,
'-%s.%s' % (version_string, suf),
count = 0)
-# Update QMTest/TestSCons.py
+# Update testing/framework/TestSCons.py
-t = UpdateFile(os.path.join('QMTest', 'TestSCons.py'))
+t = UpdateFile(os.path.join('testing','framework', 'TestSCons.py'))
if DEBUG: t.file = '/tmp/TestSCons.py'
t.replace_assign('copyright_years', repr(copyright_years))
t.replace_assign('default_version', repr(version_string))
diff --git a/bin/upload-release-files.sh b/bin/upload-release-files.sh
index c853bda..577203e 100755
--- a/bin/upload-release-files.sh
+++ b/bin/upload-release-files.sh
@@ -19,17 +19,10 @@ SF_TOPDIR='/home/frs/project/scons'
cd build/dist
cp -f ../../src/CHANGES.txt ../../src/RELEASE.txt ../../src/Announce.txt ../../src/README.txt .
-cp scons-$VERSION.win32.exe scons-$VERSION-setup.exe
-cp scons-$VERSION.win-amd64.exe scons-$VERSION-amd64-setup.exe
-
set -x
# Upload main scons release files:
$RSYNC $RSYNCOPTS \
- scons-$VERSION-1.noarch.rpm \
- scons-$VERSION-1.src.rpm \
- scons-$VERSION-setup.exe \
- scons-$VERSION-amd64-setup.exe \
scons-$VERSION.tar.gz \
scons-$VERSION.zip \
Announce.txt CHANGES.txt RELEASE.txt \
@@ -44,10 +37,10 @@ $RSYNC $RSYNCOPTS \
# Source packages:
$RSYNC $RSYNCOPTS \
- scons-src-$VERSION.tar.gz \
- scons-src-$VERSION.zip \
- Announce.txt CHANGES.txt RELEASE.txt \
- $SF_USER@$SF_MACHINE:$SF_TOPDIR/scons-src/$VERSION/
+ scons-src-$VERSION.tar.gz \
+ scons-src-$VERSION.zip \
+ Announce.txt CHANGES.txt RELEASE.txt \
+ $SF_USER@$SF_MACHINE:$SF_TOPDIR/scons-src/$VERSION/
# Readme
$RSYNC $RSYNCOPTS \
@@ -55,7 +48,6 @@ $RSYNC $RSYNCOPTS \
$SF_USER@$SF_MACHINE:$SF_TOPDIR/
-
#
# scons.org stuff:
#
@@ -80,7 +72,7 @@ ssh scons@scons.org "
cd ..
rm latest; ln -s $VERSION latest
rm production; ln -s $VERSION production
- for f in HTML PDF EPUB PS TEXT; do rm \$f; ln -s $VERSION/\$f \$f; done
+ for f in HTML PDF EPUB PS TEXT; do rm -f \$f; ln -s $VERSION/\$f \$f; done
"
echo '*****'
echo '***** Now manually update index.php, includes/versions.php and news-raw.xhtml on scons.org.'
diff --git a/bin/xmlagenda.py b/bin/xmlagenda.py
index fcfe53e..7091ee5 100755
--- a/bin/xmlagenda.py
+++ b/bin/xmlagenda.py
@@ -1,7 +1,9 @@
#!/usr/bin/env python
-# Query the scons.tigris.org database for the issues of interest.
-# The typical triage query is found on http://www.scons.org/wiki/BugParty
+# Query gihub issue tracker for the issues of interest.
+# The typical triage query is found on
+# https://github.com/scons/scons/wiki/BugParty
+# FIXME: this needs reworking for github, and wiki needs updating
# Download the issues from Issuezilla as XML; this creates a file
# named 'issues.xml'. Run this script in the dir containing