示例#1
0
 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)
示例#2
0
 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)
示例#3
0
文件: fetch.py 项目: bergmannf/osc2
 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)
示例#4
0
文件: fetch.py 项目: vdedyukhin/osc2
 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)
示例#5
0
 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)
示例#6
0
 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)
示例#7
0
文件: build.py 项目: scarabeusiv/osc2
    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)
示例#8
0
文件: build.py 项目: vikas-lamba/osc2
    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)
示例#9
0
文件: cpio.py 项目: vikas-lamba/osc2
    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)
示例#10
0
文件: cpio.py 项目: bergmannf/osc2
    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)
示例#11
0
    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')
示例#12
0
    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')
示例#13
0
 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)
示例#14
0
 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)
示例#15
0
 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()
示例#16
0
 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()
示例#17
0
文件: env.py 项目: scarabeusiv/osc2
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)
示例#18
0
文件: env.py 项目: vikas-lamba/osc2
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)
示例#19
0
    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
示例#20
0
    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