diff options
author | Dmitry Selyutin <ghostmansd@gmail.com> | 2017-09-08 18:34:58 +0300 |
---|---|---|
committer | Dmitry Selyutin <ghostmansd@gmail.com> | 2017-09-08 18:34:58 +0300 |
commit | 21c52a82444a2f5f3307c7e2c1212beac42b9938 (patch) | |
tree | e8e23e3cf3377bf8f202cd661b0a8f87c7ef07ad /pygnulib/GLFileSystem.py | |
parent | 4be624beba67fb2e6afd981be32b45fe73ecafb2 (diff) | |
download | gnulib-21c52a82444a2f5f3307c7e2c1212beac42b9938.tar.gz |
[pygnulib] autopep8 (fixing indentation, style, etc.)
Diffstat (limited to 'pygnulib/GLFileSystem.py')
-rw-r--r-- | pygnulib/GLFileSystem.py | 684 |
1 files changed, 344 insertions, 340 deletions
diff --git a/pygnulib/GLFileSystem.py b/pygnulib/GLFileSystem.py index 588df95cea..9821fd60c0 100644 --- a/pygnulib/GLFileSystem.py +++ b/pygnulib/GLFileSystem.py @@ -51,351 +51,355 @@ relpath = os.path.relpath # Define GLFileSystem class #=============================================================================== class GLFileSystem(object): - '''GLFileSystem class is used to create virtual filesystem, which is based on - the gnulib directory and directory specified by localdir argument. Its main - method lookup(file) is used to find file in these directories or combine it - using Linux 'patch' utility.''' - - def __init__(self, config): - '''Create new GLFileSystem instance. The only argument is localdir, - which can be an empty string too.''' - if type(config) is not GLConfig: - raise(TypeError('config must be a GLConfig, not %s' % \ - type(config).__name__)) - self.config = config - - def __repr__(self): - '''x.__repr__ <==> repr(x)''' - result = '<pygnulib.GLFileSystem %s>' % hex(id(self)) - return(result) - - def lookup(self, name): - '''GLFileSystem.lookup(name) -> tuple - - Lookup a file in gnulib and localdir directories or combine it using Linux - 'patch' utility. If file was found, method returns string, else it raises - GLError telling that file was not found. Function also returns flag which - indicates whether file is a temporary file. - GLConfig: localdir.''' - if type(name) is bytes or type(name) is string: - if type(name) is bytes: - name = name.decode(ENCS['default']) - else: # if name has not bytes or string type - raise(TypeError( - 'name must be a string, not %s' % type(module).__name__)) - # If name exists in localdir, then we use it - path_gnulib = joinpath(DIRS['root'], name) - path_local = joinpath(self.config['localdir'], name) - path_diff = joinpath(self.config['localdir'], '%s.diff' % name) - path_temp = joinpath(self.config['tempdir'], name) - try: # Try to create directories - os.makedirs(os.path.dirname(path_temp)) - except OSError as error: - pass # Skip errors if directory exists - if isfile(path_temp): - os.remove(path_temp) - if self.config['localdir'] and isfile(path_local): - result = (path_local, False) - else: # if path_local does not exist - if isfile(path_gnulib): - if self.config['localdir'] and isfile(path_diff): - shutil.copy(path_gnulib, path_temp) - command = 'patch -s "%s" < "%s"' % (path_temp, path_diff) - try: # Try to apply patch - sp.check_call(command, shell=True) - except sp.CalledProcessError as error: - raise(GLError(2, name)) - result = (path_temp, True) - else: # if path_diff does not exist - result = (path_gnulib, False) - else: # if path_gnulib does not exist - raise(GLError(1, name)) - return(result) + '''GLFileSystem class is used to create virtual filesystem, which is based on + the gnulib directory and directory specified by localdir argument. Its main + method lookup(file) is used to find file in these directories or combine it + using Linux 'patch' utility.''' + + def __init__(self, config): + '''Create new GLFileSystem instance. The only argument is localdir, + which can be an empty string too.''' + if type(config) is not GLConfig: + raise(TypeError('config must be a GLConfig, not %s' % + type(config).__name__)) + self.config = config + + def __repr__(self): + '''x.__repr__ <==> repr(x)''' + result = '<pygnulib.GLFileSystem %s>' % hex(id(self)) + return(result) + + def lookup(self, name): + '''GLFileSystem.lookup(name) -> tuple + + Lookup a file in gnulib and localdir directories or combine it using Linux + 'patch' utility. If file was found, method returns string, else it raises + GLError telling that file was not found. Function also returns flag which + indicates whether file is a temporary file. + GLConfig: localdir.''' + if type(name) is bytes or type(name) is string: + if type(name) is bytes: + name = name.decode(ENCS['default']) + else: # if name has not bytes or string type + raise(TypeError( + 'name must be a string, not %s' % type(module).__name__)) + # If name exists in localdir, then we use it + path_gnulib = joinpath(DIRS['root'], name) + path_local = joinpath(self.config['localdir'], name) + path_diff = joinpath(self.config['localdir'], '%s.diff' % name) + path_temp = joinpath(self.config['tempdir'], name) + try: # Try to create directories + os.makedirs(os.path.dirname(path_temp)) + except OSError as error: + pass # Skip errors if directory exists + if isfile(path_temp): + os.remove(path_temp) + if self.config['localdir'] and isfile(path_local): + result = (path_local, False) + else: # if path_local does not exist + if isfile(path_gnulib): + if self.config['localdir'] and isfile(path_diff): + shutil.copy(path_gnulib, path_temp) + command = 'patch -s "%s" < "%s"' % (path_temp, path_diff) + try: # Try to apply patch + sp.check_call(command, shell=True) + except sp.CalledProcessError as error: + raise(GLError(2, name)) + result = (path_temp, True) + else: # if path_diff does not exist + result = (path_gnulib, False) + else: # if path_gnulib does not exist + raise(GLError(1, name)) + return(result) #=============================================================================== # Define GLFileAssistant class #=============================================================================== class GLFileAssistant(object): - '''GLFileAssistant is used to help with file processing.''' - - def __init__(self, config, transformers=dict()): - '''Create GLFileAssistant instance.''' - if type(config) is not GLConfig: - raise(TypeError('config must be a GLConfig, not %s' % \ - type(config).__name__)) - if type(transformers) is not dict: - raise(TypeError('transformers must be a dict, not %s' % \ - type(transformers).__name__)) - for key in ['lib', 'aux', 'main', 'tests']: - if key not in transformers: - transformers[key] = 's,x,x,' - else: # if key in transformers - value = transformers[key] - if type(value) is bytes or type(value) is string: - if type(value) is bytes: - transformers[key] = value.decode(ENCS['default']) - else: # if value has not bytes or string type - raise(TypeError('transformers[%s] must be a string, not %s' % \ - (key, type(value).__name__))) - self.original = None - self.rewritten = None - self.added = list() - self.makefile = list() - self.config = config - self.transformers = transformers - self.filesystem = GLFileSystem(self.config) - - def __repr__(self): - '''x.__repr__() <==> repr(x)''' - result = '<pygnulib.GLFileAssistant %s>' % hex(id(self)) - return(result) - - def tmpfilename(self, path): - '''GLFileAssistant.tmpfilename() -> string - - Return the name of a temporary file (file is relative to destdir).''' - if type(path) is bytes or type(path) is string: - if type(path) is bytes: - path = path.decode(ENCS['default']) - else: # if path has not bytes or string type - raise(TypeError( - 'path must be a string, not %s' % (type(path).__name__))) - if not self.config['dryrun']: - # Put the new contents of $file in a file in the same directory (needed - # to guarantee that an 'mv' to "$destdir/$file" works). - result = joinpath(self.config['destdir'], '%s.tmp' % path) - dirname = os.path.dirname(result) - if dirname and not isdir(dirname): - os.makedirs(dirname) - else: # if self.config['dryrun'] - # Put the new contents of $file in a file in a temporary directory - # (because the directory of "$file" might not exist). - tempdir = self.config['tempdir'] - result = joinpath(tempdir, '%s.tmp' % os.path.basename(path)) - dirname = os.path.dirname(result) - if not isdir(dirname): - os.makedirs(dirname) - if type(result) is bytes: - result = bytes.decode(ENCS['default']) - return(result) - - def setOriginal(self, original): - '''GLFileAssistant.setOriginal(original) - - Set the name of the original file which will be used.''' - if type(original) is bytes or type(original) is string: - if type(original) is bytes: - original = original.decode(ENCS['default']) - else: # if original has not bytes or string type - raise(TypeError( - 'original must be a string, not %s' % (type(original).__name__))) - self.original = original - - def setRewritten(self, rewritten): - '''GLFileAssistant.setRewritten(rewritten) - - Set the name of the rewritten file which will be used.''' - if type(rewritten) is bytes or type(rewritten) is string: - if type(rewritten) is bytes: - rewritten = rewritten.decode(ENCS['default']) - else: # if rewritten has not bytes or string type - raise(TypeError( - 'rewritten must be a string, not %s' % type(rewritten).__name__)) - self.rewritten = rewritten - - def addFile(self, file): - '''GLFileAssistant.addFile(file) - - Add file to the list of added files.''' - if file not in self.added: - self.added += [file] - - def removeFile(self, file): - '''GLFileAssistant.removeFile(file) - - Remove file from the list of added files.''' - if file in self.added: - self.added.pop(file) - - def getFiles(self): - '''Return list of the added files.''' - return(list(self.added)) - - def add(self, lookedup, tmpflag, tmpfile): - '''GLFileAssistant.add(lookedup, tmpflag, tmpfile) - - This method copies a file from gnulib into the destination directory. - The destination is known to exist. If tmpflag is True, then lookedup file - is a temporary one.''' - original = self.original - rewritten = self.rewritten - destdir = self.config['destdir'] - symbolic = self.config['symbolic'] - lsymbolic = self.config['lsymbolic'] - if original == None: - raise(TypeError('original must be set before applying the method')) - elif rewritten == None: - raise(TypeError('rewritten must be set before applying the method')) - if not self.config['dryrun']: - print('Copying file %s' % rewritten) - loriginal = joinpath(self.config['localdir'], original) - if (symbolic or (lsymbolic and lookedup == loriginal)) \ - and not tmpflag and filecmp.cmp(lookedup, tmpfile): - constants.link_if_changed(lookedup, joinpath(destdir, rewritten)) - else: # if any of these conditions is not met - try: # Try to move file - shutil.move(tmpfile, joinpath(destdir, rewritten)) - except Exception as error: - raise(GLError(17, original)) - else: # if self.config['dryrun'] - print('Copy file %s' % rewritten) - - def update(self, lookedup, tmpflag, tmpfile, already_present): - '''GLFileAssistant.update(lookedup, tmpflag, tmpfile, already_present) - - This method copies a file from gnulib into the destination directory. - The destination is known to exist. If tmpflag is True, then lookedup file - is a temporary one.''' - original = self.original - rewritten = self.rewritten - destdir = self.config['destdir'] - symbolic = self.config['symbolic'] - lsymbolic = self.config['lsymbolic'] - if original == None: - raise(TypeError('original must be set before applying the method')) - elif rewritten == None: - raise(TypeError('rewritten must be set before applying the method')) - if type(lookedup) is bytes or type(lookedup) is string: - if type(lookedup) is bytes: - lookedup = lookedup.decode(ENCS['default']) - else: # if lookedup has not bytes or string type - raise(TypeError('lookedup must be a string, not %s' % \ - type(lookedup).__name__)) - if type(already_present) is not bool: - raise(TypeError('already_present must be a bool, not %s' % \ - type(already_present).__name__)) - basename = rewritten - backupname = string('%s~' % basename) - basepath = joinpath(destdir, basename) - backuppath = joinpath(destdir, backupname) - if not filecmp.cmp(basepath, tmpfile): - if not self.config['dryrun']: - if already_present: - print('Updating file %s (backup in %s)' % (basename, backupname)) - else: # if not already_present - message = 'Replacing file ' - message += '%s (non-gnulib code backed up in ' % basename - message += '%s) !!' % backupname - print(message) - if isfile(backuppath): - os.remove(backuppath) - try: # Try to replace the given file - shutil.move(basepath, backuppath) - except Exception as error: - raise(GLError(17, original)) - loriginal = joinpath(self.config['localdir'], original) - if (symbolic or (lsymbolic and lookedup == loriginal)) \ - and not tmpflag and filecmp.cmp(lookedup, tmpfile): - constants.link_if_changed(lookedup, basepath) - else: # if any of these conditions is not met - try: # Try to move file - if os.path.exists(basepath): - os.remove(basepath) - shutil.copy(tmpfile, rewritten) - except Exception as error: - raise(GLError(17, original)) - else: # if self.config['dryrun'] - if already_present: - print('Update file %s (backup in %s)' % (rewritten, backup)) - else: # if not already_present - print('Replace file %s (backup in %s)' % (rewritten, backup)) - - def add_or_update(self, already_present): - '''GLFileAssistant.add_or_update(already_present) - - This method handles a file that ought to be present afterwards.''' - original = self.original - rewritten = self.rewritten - if original == None: - raise(TypeError('original must be set before applying the method')) - elif rewritten == None: - raise(TypeError('rewritten must be set before applying the method')) - if type(already_present) is not bool: - raise(TypeError('already_present must be a bool, not %s' % \ - type(already_present).__name__)) - xoriginal = original - if original.startswith('tests=lib/'): - xoriginal = constants.substart('tests=lib/', 'lib/', original) - lookedup, tmpflag = self.filesystem.lookup(xoriginal) - tmpfile = self.tmpfilename(rewritten) - sed_transform_lib_file = self.transformers.get('lib', '') - sed_transform_build_aux_file = self.transformers.get('aux', '') - sed_transform_main_lib_file = self.transformers.get('main', '') - sed_transform_testsrelated_lib_file = self.transformers.get('tests', '') - try: # Try to copy lookedup file to tmpfile - shutil.copy(lookedup, tmpfile) - except Exception as error: - raise(GLError(15, lookedup)) - transformer = string() - if original.startswith('lib/'): - if sed_transform_main_lib_file: - transformer = sed_transform_main_lib_file - elif original.startswith('build-aux/'): - if sed_transform_build_aux_file: - transformer = sed_transform_build_aux_file - elif original.startswith('tests=lib/'): - if sed_transform_testsrelated_lib_file: - transformer = sed_transform_testsrelated_lib_file - if transformer: - args = ['sed', '-e', transformer] - stdin = codecs.open(lookedup, 'rb', 'UTF-8') - try: # Try to transform file - data = sp.check_output(args, stdin=stdin, shell=False) - data = data.decode("UTF-8") - except Exception as error: - raise(GLError(16, lookedup)) - with codecs.open(tmpfile, 'wb', 'UTF-8') as file: - file.write(data) - path = joinpath(self.config['destdir'], rewritten) - if isfile(path): - self.update(lookedup, tmpflag, tmpfile, already_present) - os.remove(tmpfile) - else: # if not isfile(path) - self.add(lookedup, tmpflag, tmpfile) - self.addFile(rewritten) - - def super_update(self, basename, tmpfile): - '''GLFileAssistant.super_update(basename, tmpfile) -> tuple - - Move tmpfile to destdir/basename path, making a backup of it. - Returns tuple, which contains basename, backupname and status. - 0: tmpfile is the same as destfile; - 1: tmpfile was used to update destfile; - 2: destfile was created, because it didn't exist.''' - backupname = '%s~' % basename - basepath = joinpath(self.config['destdir'], basename) - backuppath = joinpath(self.config['destdir'], backupname) - if isfile(basepath): - if filecmp.cmp(basepath, tmpfile): - result_flag = 0 - else: # if not filecmp.cmp(basepath, tmpfile) - result_flag = 1 + '''GLFileAssistant is used to help with file processing.''' + + def __init__(self, config, transformers=dict()): + '''Create GLFileAssistant instance.''' + if type(config) is not GLConfig: + raise(TypeError('config must be a GLConfig, not %s' % + type(config).__name__)) + if type(transformers) is not dict: + raise(TypeError('transformers must be a dict, not %s' % + type(transformers).__name__)) + for key in ['lib', 'aux', 'main', 'tests']: + if key not in transformers: + transformers[key] = 's,x,x,' + else: # if key in transformers + value = transformers[key] + if type(value) is bytes or type(value) is string: + if type(value) is bytes: + transformers[key] = value.decode(ENCS['default']) + else: # if value has not bytes or string type + raise(TypeError('transformers[%s] must be a string, not %s' % + (key, type(value).__name__))) + self.original = None + self.rewritten = None + self.added = list() + self.makefile = list() + self.config = config + self.transformers = transformers + self.filesystem = GLFileSystem(self.config) + + def __repr__(self): + '''x.__repr__() <==> repr(x)''' + result = '<pygnulib.GLFileAssistant %s>' % hex(id(self)) + return(result) + + def tmpfilename(self, path): + '''GLFileAssistant.tmpfilename() -> string + + Return the name of a temporary file (file is relative to destdir).''' + if type(path) is bytes or type(path) is string: + if type(path) is bytes: + path = path.decode(ENCS['default']) + else: # if path has not bytes or string type + raise(TypeError( + 'path must be a string, not %s' % (type(path).__name__))) if not self.config['dryrun']: - if isfile(backuppath): - os.remove(backuppath) - shutil.move(basepath, backuppath) - shutil.move(tmpfile, basepath) - else: # if self.config['dryrun'] - os.remove(tmpfile) - else: # if not isfile(basepath) - result_flag = 2 - if not self.config['dryrun']: - if isfile(basepath): - os.remove(basepath) - shutil.move(tmpfile, basepath) - else: # if self.config['dryrun'] - os.remove(tmpfile) - result = tuple([basename, backupname, result_flag]) - return(result) + # Put the new contents of $file in a file in the same directory (needed + # to guarantee that an 'mv' to "$destdir/$file" works). + result = joinpath(self.config['destdir'], '%s.tmp' % path) + dirname = os.path.dirname(result) + if dirname and not isdir(dirname): + os.makedirs(dirname) + else: # if self.config['dryrun'] + # Put the new contents of $file in a file in a temporary directory + # (because the directory of "$file" might not exist). + tempdir = self.config['tempdir'] + result = joinpath(tempdir, '%s.tmp' % os.path.basename(path)) + dirname = os.path.dirname(result) + if not isdir(dirname): + os.makedirs(dirname) + if type(result) is bytes: + result = bytes.decode(ENCS['default']) + return(result) + + def setOriginal(self, original): + '''GLFileAssistant.setOriginal(original) + + Set the name of the original file which will be used.''' + if type(original) is bytes or type(original) is string: + if type(original) is bytes: + original = original.decode(ENCS['default']) + else: # if original has not bytes or string type + raise(TypeError( + 'original must be a string, not %s' % (type(original).__name__))) + self.original = original + + def setRewritten(self, rewritten): + '''GLFileAssistant.setRewritten(rewritten) + + Set the name of the rewritten file which will be used.''' + if type(rewritten) is bytes or type(rewritten) is string: + if type(rewritten) is bytes: + rewritten = rewritten.decode(ENCS['default']) + else: # if rewritten has not bytes or string type + raise(TypeError( + 'rewritten must be a string, not %s' % type(rewritten).__name__)) + self.rewritten = rewritten + def addFile(self, file): + '''GLFileAssistant.addFile(file) + + Add file to the list of added files.''' + if file not in self.added: + self.added += [file] + + def removeFile(self, file): + '''GLFileAssistant.removeFile(file) + + Remove file from the list of added files.''' + if file in self.added: + self.added.pop(file) + + def getFiles(self): + '''Return list of the added files.''' + return(list(self.added)) + + def add(self, lookedup, tmpflag, tmpfile): + '''GLFileAssistant.add(lookedup, tmpflag, tmpfile) + + This method copies a file from gnulib into the destination directory. + The destination is known to exist. If tmpflag is True, then lookedup file + is a temporary one.''' + original = self.original + rewritten = self.rewritten + destdir = self.config['destdir'] + symbolic = self.config['symbolic'] + lsymbolic = self.config['lsymbolic'] + if original == None: + raise(TypeError('original must be set before applying the method')) + elif rewritten == None: + raise(TypeError('rewritten must be set before applying the method')) + if not self.config['dryrun']: + print('Copying file %s' % rewritten) + loriginal = joinpath(self.config['localdir'], original) + if (symbolic or (lsymbolic and lookedup == loriginal)) \ + and not tmpflag and filecmp.cmp(lookedup, tmpfile): + constants.link_if_changed( + lookedup, joinpath(destdir, rewritten)) + else: # if any of these conditions is not met + try: # Try to move file + shutil.move(tmpfile, joinpath(destdir, rewritten)) + except Exception as error: + raise(GLError(17, original)) + else: # if self.config['dryrun'] + print('Copy file %s' % rewritten) + + def update(self, lookedup, tmpflag, tmpfile, already_present): + '''GLFileAssistant.update(lookedup, tmpflag, tmpfile, already_present) + + This method copies a file from gnulib into the destination directory. + The destination is known to exist. If tmpflag is True, then lookedup file + is a temporary one.''' + original = self.original + rewritten = self.rewritten + destdir = self.config['destdir'] + symbolic = self.config['symbolic'] + lsymbolic = self.config['lsymbolic'] + if original == None: + raise(TypeError('original must be set before applying the method')) + elif rewritten == None: + raise(TypeError('rewritten must be set before applying the method')) + if type(lookedup) is bytes or type(lookedup) is string: + if type(lookedup) is bytes: + lookedup = lookedup.decode(ENCS['default']) + else: # if lookedup has not bytes or string type + raise(TypeError('lookedup must be a string, not %s' % + type(lookedup).__name__)) + if type(already_present) is not bool: + raise(TypeError('already_present must be a bool, not %s' % + type(already_present).__name__)) + basename = rewritten + backupname = string('%s~' % basename) + basepath = joinpath(destdir, basename) + backuppath = joinpath(destdir, backupname) + if not filecmp.cmp(basepath, tmpfile): + if not self.config['dryrun']: + if already_present: + print('Updating file %s (backup in %s)' % + (basename, backupname)) + else: # if not already_present + message = 'Replacing file ' + message += '%s (non-gnulib code backed up in ' % basename + message += '%s) !!' % backupname + print(message) + if isfile(backuppath): + os.remove(backuppath) + try: # Try to replace the given file + shutil.move(basepath, backuppath) + except Exception as error: + raise(GLError(17, original)) + loriginal = joinpath(self.config['localdir'], original) + if (symbolic or (lsymbolic and lookedup == loriginal)) \ + and not tmpflag and filecmp.cmp(lookedup, tmpfile): + constants.link_if_changed(lookedup, basepath) + else: # if any of these conditions is not met + try: # Try to move file + if os.path.exists(basepath): + os.remove(basepath) + shutil.copy(tmpfile, rewritten) + except Exception as error: + raise(GLError(17, original)) + else: # if self.config['dryrun'] + if already_present: + print('Update file %s (backup in %s)' % + (rewritten, backup)) + else: # if not already_present + print('Replace file %s (backup in %s)' % + (rewritten, backup)) + + def add_or_update(self, already_present): + '''GLFileAssistant.add_or_update(already_present) + + This method handles a file that ought to be present afterwards.''' + original = self.original + rewritten = self.rewritten + if original == None: + raise(TypeError('original must be set before applying the method')) + elif rewritten == None: + raise(TypeError('rewritten must be set before applying the method')) + if type(already_present) is not bool: + raise(TypeError('already_present must be a bool, not %s' % + type(already_present).__name__)) + xoriginal = original + if original.startswith('tests=lib/'): + xoriginal = constants.substart('tests=lib/', 'lib/', original) + lookedup, tmpflag = self.filesystem.lookup(xoriginal) + tmpfile = self.tmpfilename(rewritten) + sed_transform_lib_file = self.transformers.get('lib', '') + sed_transform_build_aux_file = self.transformers.get('aux', '') + sed_transform_main_lib_file = self.transformers.get('main', '') + sed_transform_testsrelated_lib_file = self.transformers.get( + 'tests', '') + try: # Try to copy lookedup file to tmpfile + shutil.copy(lookedup, tmpfile) + except Exception as error: + raise(GLError(15, lookedup)) + transformer = string() + if original.startswith('lib/'): + if sed_transform_main_lib_file: + transformer = sed_transform_main_lib_file + elif original.startswith('build-aux/'): + if sed_transform_build_aux_file: + transformer = sed_transform_build_aux_file + elif original.startswith('tests=lib/'): + if sed_transform_testsrelated_lib_file: + transformer = sed_transform_testsrelated_lib_file + if transformer: + args = ['sed', '-e', transformer] + stdin = codecs.open(lookedup, 'rb', 'UTF-8') + try: # Try to transform file + data = sp.check_output(args, stdin=stdin, shell=False) + data = data.decode("UTF-8") + except Exception as error: + raise(GLError(16, lookedup)) + with codecs.open(tmpfile, 'wb', 'UTF-8') as file: + file.write(data) + path = joinpath(self.config['destdir'], rewritten) + if isfile(path): + self.update(lookedup, tmpflag, tmpfile, already_present) + os.remove(tmpfile) + else: # if not isfile(path) + self.add(lookedup, tmpflag, tmpfile) + self.addFile(rewritten) + + def super_update(self, basename, tmpfile): + '''GLFileAssistant.super_update(basename, tmpfile) -> tuple + + Move tmpfile to destdir/basename path, making a backup of it. + Returns tuple, which contains basename, backupname and status. + 0: tmpfile is the same as destfile; + 1: tmpfile was used to update destfile; + 2: destfile was created, because it didn't exist.''' + backupname = '%s~' % basename + basepath = joinpath(self.config['destdir'], basename) + backuppath = joinpath(self.config['destdir'], backupname) + if isfile(basepath): + if filecmp.cmp(basepath, tmpfile): + result_flag = 0 + else: # if not filecmp.cmp(basepath, tmpfile) + result_flag = 1 + if not self.config['dryrun']: + if isfile(backuppath): + os.remove(backuppath) + shutil.move(basepath, backuppath) + shutil.move(tmpfile, basepath) + else: # if self.config['dryrun'] + os.remove(tmpfile) + else: # if not isfile(basepath) + result_flag = 2 + if not self.config['dryrun']: + if isfile(basepath): + os.remove(basepath) + shutil.move(tmpfile, basepath) + else: # if self.config['dryrun'] + os.remove(tmpfile) + result = tuple([basename, backupname, result_flag]) + return(result) |