summaryrefslogtreecommitdiff
path: root/engine/SCons/SConsign.py
diff options
context:
space:
mode:
Diffstat (limited to 'engine/SCons/SConsign.py')
-rw-r--r--engine/SCons/SConsign.py39
1 files changed, 26 insertions, 13 deletions
diff --git a/engine/SCons/SConsign.py b/engine/SCons/SConsign.py
index 6fb018b..9d2f69e 100644
--- a/engine/SCons/SConsign.py
+++ b/engine/SCons/SConsign.py
@@ -5,7 +5,7 @@ Writing and reading information to the .sconsign file or files.
"""
#
-# Copyright (c) 2001 - 2016 The SCons Foundation
+# Copyright (c) 2001 - 2017 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,17 +27,21 @@ Writing and reading information to the .sconsign file or files.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/SConsign.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog"
+from __future__ import print_function
+
+__revision__ = "src/engine/SCons/SConsign.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
import SCons.compat
import os
-# compat layer imports "cPickle" for us if it's available.
import pickle
import SCons.dblite
import SCons.Warnings
+from SCons.compat import PICKLE_PROTOCOL
+
+
def corrupt_dblite_warning(filename):
SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning,
"Ignoring corrupt .sconsign file: %s"%filename)
@@ -45,7 +49,7 @@ def corrupt_dblite_warning(filename):
SCons.dblite.ignore_corrupt_dbfiles = 1
SCons.dblite.corruption_warning = corrupt_dblite_warning
-#XXX Get rid of the global array so this becomes re-entrant.
+# XXX Get rid of the global array so this becomes re-entrant.
sig_files = []
# Info for the database SConsign implementation (now the default):
@@ -59,6 +63,7 @@ DB_Module = SCons.dblite
DB_Name = ".sconsign"
DB_sync_list = []
+
def Get_DataBase(dir):
global DataBase, DB_Module, DB_Name
top = dir.fs.Top
@@ -84,9 +89,10 @@ def Get_DataBase(dir):
DB_sync_list.append(db)
return db, "c"
except TypeError:
- print "DataBase =", DataBase
+ print("DataBase =", DataBase)
raise
+
def Reset():
"""Reset global state. Used by unit tests that end up using
SConsign multiple times to get a clean slate for each test."""
@@ -96,6 +102,7 @@ def Reset():
normcase = os.path.normcase
+
def write():
global sig_files
for sig_file in sig_files:
@@ -114,6 +121,7 @@ def write():
else:
closemethod()
+
class SConsignEntry(object):
"""
Wrapper class for the generic entry in a .sconsign file.
@@ -124,16 +132,16 @@ class SConsignEntry(object):
"""
__slots__ = ("binfo", "ninfo", "__weakref__")
current_version_id = 2
-
+
def __init__(self):
# Create an object attribute from the class attribute so it ends up
# in the pickled data in the .sconsign file.
#_version_id = self.current_version_id
pass
-
+
def convert_to_sconsign(self):
self.binfo.convert_to_sconsign()
-
+
def convert_from_sconsign(self, dir, name):
self.binfo.convert_from_sconsign(dir, name)
@@ -155,7 +163,8 @@ class SConsignEntry(object):
for key, value in state.items():
if key not in ('_version_id','__weakref__'):
setattr(self, key, value)
-
+
+
class Base(object):
"""
This is the controlling class for the signatures for the collection of
@@ -210,6 +219,7 @@ class Base(object):
self.entries[key] = entry
self.to_be_merged = {}
+
class DB(Base):
"""
A Base subclass that reads and writes signature information
@@ -239,7 +249,7 @@ class DB(Base):
raise TypeError
except KeyboardInterrupt:
raise
- except Exception, e:
+ except Exception as e:
SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning,
"Ignoring corrupt sconsign entry : %s (%s)\n"%(self.dir.get_tpath(), e))
for key, entry in self.entries.items():
@@ -271,7 +281,7 @@ class DB(Base):
path = normcase(self.dir.get_internal_path())
for key, entry in self.entries.items():
entry.convert_to_sconsign()
- db[path] = pickle.dumps(self.entries, 1)
+ db[path] = pickle.dumps(self.entries, PICKLE_PROTOCOL)
if sync:
try:
@@ -282,6 +292,7 @@ class DB(Base):
else:
syncmethod()
+
class Dir(Base):
def __init__(self, fp=None, dir=None):
"""
@@ -301,6 +312,7 @@ class Dir(Base):
for key, entry in self.entries.items():
entry.convert_from_sconsign(dir, key)
+
class DirFile(Dir):
"""
Encapsulates reading and writing a per-directory .sconsign file.
@@ -359,12 +371,12 @@ class DirFile(Dir):
return
for key, entry in self.entries.items():
entry.convert_to_sconsign()
- pickle.dump(self.entries, file, 1)
+ pickle.dump(self.entries, file, PICKLE_PROTOCOL)
file.close()
if fname != self.sconsign:
try:
mode = os.stat(self.sconsign)[0]
- os.chmod(self.sconsign, 0666)
+ os.chmod(self.sconsign, 0o666)
os.unlink(self.sconsign)
except (IOError, OSError):
# Try to carry on in the face of either OSError
@@ -391,6 +403,7 @@ class DirFile(Dir):
ForDirectory = DB
+
def File(name, dbm_module=None):
"""
Arrange for all signatures to be stored in a global .sconsign.db*