def _perform_merges(self, ustate): uinfo = ustate.info filestates = ustate.entrystates for filename in uinfo.modified: wc_filename = os.path.join(self.path, filename) old_filename = wc_pkg_data_filename(self.path, filename) your_filename = os.path.join(ustate.location, filename) st = filestates[filename] if st == '!' or st == 'D' and not os.path.exists(wc_filename): my_filename = old_filename else: # XXX: in some weird cases wc_filename.mine might be a tracked # file - for now overwrite it my_filename = wc_filename + '.mine' # a rename would be more efficient but also more error prone # (if a update is interrupted) copy_file(wc_filename, my_filename) merge = self.merge_class() ret = merge.merge(my_filename, old_filename, your_filename, wc_filename) if ret == Merge.SUCCESS: if st == 'D': ustate.processed(filename, 'D') else: ustate.processed(filename, ' ') os.unlink(my_filename) elif ret in (Merge.CONFLICT, Merge.BINARY, Merge.FAILURE): copy_file(your_filename, wc_filename + '.rev%s' % uinfo.srcmd5) ustate.processed(filename, 'C') # copy over new storefile os.rename(your_filename, old_filename) self.notifier.processed(filename, ustate.entrystates[filename], st)
def write(self, bdep, source): if self.exists(bdep): msg = "bdep for file \"%s\" already exists" % bdep.get('filename') raise ValueError(msg) fname = self._calculate_filename(bdep) dirname = os.path.dirname(fname) if not os.path.exists(dirname): os.makedirs(dirname) copy_file(source, fname)
def _perform_adds(self, ustate): uinfo = ustate.info for filename in uinfo.added: wc_filename = os.path.join(self.path, filename) store_filename = wc_pkg_data_filename(self.path, filename) new_filename = os.path.join(ustate.location, filename) copy_file(new_filename, wc_filename) ustate.processed(filename, ' ') os.rename(new_filename, store_filename) self.notifier.processed(filename, ' ', None)
def write_to(self, dest): """Write buildinfo xml to dest. Either dest is a path to a file or a file-like object (that is it has a write method). """ xml_data = etree.tostring(self._xml, pretty_print=True) sio = StringIO(xml_data) copy_file(sio, dest)
def copyin(self, dest): """Copies the entity to dest. Despite the fact that the base class requires that dest is a directory dest can also be a file or file-like object. """ if not hasattr(dest, 'write'): # no file-like object dest = os.path.join(dest, self.hdr.name) copy_file(self, dest, mode=self.hdr.mode, mtime=self.hdr.mtime)
def write_to(self, dest, size=-1): """Write file to dest. If dest is a file-like object (that is it has a write(buf) method) it's write method will be called. If dest is a filename the data will be written to it (existing files will be overwritten, if the file doesn't exist it will be created). Keyword arguments: size -- write only size bytes (default: -1 (means write everything)) """ copy_file(self, dest, mtime=self.mtime, mode=self.mode, bufsize=self.stream_bufsize, size=size, read_method='_read')
def _commit(self, cstate, **kwargs): cinfo = cstate.info # FIXME: validation if cstate.state == CommitStateMixin.STATE_TRANSFER: cfilelist = self._calculate_commit_filelist(cinfo) missing = self._commit_filelist(cfilelist, **kwargs) send_filenames = self._read_send_files(missing) if send_filenames: self._commit_files(cstate, send_filenames) filelist = self._commit_filelist(cfilelist, **kwargs) else: filelist = missing cstate.append_filelist(filelist) cstate.state = CommitStateMixin.STATE_COMMITTING # only local changes left for filename in cinfo.deleted: store_filename = wc_pkg_data_filename(self.path, filename) # it might be already removed (if we resume a commit) if os.path.exists(store_filename): os.unlink(store_filename) cstate.processed(filename, None) self.notifier.processed(filename, None) for filename in os.listdir(cstate.location): wc_filename = os.path.join(self.path, filename) store_filename = wc_pkg_data_filename(self.path, filename) commit_filename = os.path.join(cstate.location, filename) if os.path.exists(store_filename): # just to reduce disk space usage os.unlink(store_filename) copy_file(commit_filename, wc_filename) os.rename(commit_filename, store_filename) self._files.merge(cstate.entrystates, cstate.filelist) # fixup mtimes for filename in self.files(): if self.status(filename) != ' ': continue entry = self._files.find(filename) wc_filename = os.path.join(self.path, filename) store_filename = wc_pkg_data_filename(self.path, filename) mtime = int(entry.get('mtime')) os.utime(wc_filename, (-1, mtime)) os.utime(store_filename, (-1, mtime)) cstate.cleanup() self.notifier.finished('commit', aborted=False)
def _revert(self, filename): st = self.status(filename) wc_filename = os.path.join(self.path, filename) store_filename = wc_pkg_data_filename(self.path, filename) entry = self._files.find(filename) if st == 'C': raise ValueError("cannot revert conflicted file: %s" % filename) elif st == '?': raise ValueError("cannot revert untracked file: %s" % filename) elif st == 'S': raise ValueError("cannot revert skipped file: %s" % filename) elif st == 'A' or st == '!' and entry.get('state') == 'A': self._files.remove(filename) elif st == 'D': self._files.set(filename, ' ') if not os.path.exists(wc_filename): copy_file(store_filename, wc_filename) elif st in ('M', '!'): self._files.set(filename, ' ') copy_file(store_filename, wc_filename) self._files.write()
def run_pager(source, pager="less", suffix=""): """Runs pager on source source. If the env variable $PAGER is not set the pager keyword argument is used. Either source is a str or file or file-like object. Keyword arguments: pager -- the default pager (default: less) suffix -- the suffix of the tempfile (default: '') """ cmd = [os.getenv("PAGER", default=pager)] with mkstemp(prefix="osc_", suffix=suffix) as f: if hasattr(source, "read"): copy_file(source, f) else: f.write(source) f.flush() cmd.append(f) return subprocess.call(cmd, shell=False)
def run_pager(source, pager='less', suffix=''): """Runs pager on source source. If the env variable $PAGER is not set the pager keyword argument is used. Either source is a str or file or file-like object. Keyword arguments: pager -- the default pager (default: less) suffix -- the suffix of the tempfile (default: '') """ cmd = [os.getenv('PAGER', default=pager)] with mkstemp(prefix='osc_', suffix=suffix) as f: if hasattr(source, 'read'): copy_file(source, f) else: f.write(source) f.flush() cmd.append(f) return subprocess.call(cmd, shell=False)
def merge(self, my_filename, old_filename, your_filename, out_filename): """Perform a file merge. Return values: SUCCESS -- merge was successfull CONFLICTS -- some conflicts occurred BINARY -- the file is a binary file and cannot be merged FAILURE -- some internal failure occurred """ if is_binaryfile(my_filename) or is_binaryfile(your_filename): if file_md5(my_filename) == file_md5(old_filename): copy_file(your_filename, out_filename) return Merge.SUCCESS return Merge.BINARY merge_cmd = "diff3 -m -E %s %s %s > %s" % (my_filename, old_filename, your_filename, out_filename) ret = subprocess.call(merge_cmd, shell=True) if ret == 0: return Merge.SUCCESS elif ret == 1: return Merge.CONFLICT else: return Merge.FAILURE