~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/sftp.py

  • Committer: John Arbash Meinel
  • Date: 2006-09-05 22:17:15 UTC
  • mto: (1946.2.8 reduce-knit-churn)
  • mto: This revision was merged to the branch mainline in revision 1988.
  • Revision ID: john@arbash-meinel.com-20060905221715-a42babddf5f61833
Update the LocalTransport and SftpTransport to implement non_atomic_*

Show diffs side-by-side

added added

removed removed

Lines of Context:
425
425
            # raise the original with its traceback if we can.
426
426
            raise
427
427
 
428
 
    def non_atomic_put(self, relpath, f, mode=None, create_parent_dir=False):
429
 
        """Copy the file-like object into the target location.
430
 
 
431
 
        This function is not strictly safe to use. It is only meant to
432
 
        be used when you already know that the target does not exist.
433
 
        It is not safe, because it will open and truncate the remote
434
 
        file. So there may be a time when the file has invalid contents.
435
 
 
436
 
        :param relpath: The remote location to put the contents.
437
 
        :param f:       File-like object.
438
 
        :param mode:    Possible access permissions for new file.
439
 
                        None means do not set remote permissions.
440
 
        :param create_parent_dir: If we cannot create the target file because
441
 
                        the parent directory does not exist, go ahead and
442
 
                        create it, and then try again.
443
 
        """
 
428
    def _non_atomic_put_helper(self, relpath, writer, mode=None,
 
429
                               create_parent_dir=False):
444
430
        abspath = self._remote_path(relpath)
445
431
 
446
432
        # TODO: jam 20060816 paramiko doesn't publicly expose a way to
454
440
                try:
455
441
                    fout = self._sftp.file(abspath, mode='wb')
456
442
                    fout.set_pipelined(True)
457
 
                    self._pump(f, fout)
 
443
                    writer(fout)
458
444
                except (paramiko.SSHException, IOError), e:
459
 
                    self._translate_io_exception(e, abspath, ': unable to open')
 
445
                    self._translate_io_exception(e, abspath,
 
446
                                                 ': unable to open')
460
447
 
461
448
                # This is designed to chmod() right before we close.
462
449
                # Because we set_pipelined() earlier, theoretically we might 
484
471
                self._translate_io_exception(e, abspath, ': unable to open')
485
472
            _open_and_write_file()
486
473
 
 
474
    def non_atomic_put_file(self, relpath, f, mode=None,
 
475
                            create_parent_dir=False):
 
476
        """Copy the file-like object into the target location.
 
477
 
 
478
        This function is not strictly safe to use. It is only meant to
 
479
        be used when you already know that the target does not exist.
 
480
        It is not safe, because it will open and truncate the remote
 
481
        file. So there may be a time when the file has invalid contents.
 
482
 
 
483
        :param relpath: The remote location to put the contents.
 
484
        :param f:       File-like object.
 
485
        :param mode:    Possible access permissions for new file.
 
486
                        None means do not set remote permissions.
 
487
        :param create_parent_dir: If we cannot create the target file because
 
488
                        the parent directory does not exist, go ahead and
 
489
                        create it, and then try again.
 
490
        """
 
491
        def writer(fout):
 
492
            self._pump(f, fout)
 
493
        self._non_atomic_put_helper(relpath, writer, mode=mode,
 
494
                                    create_parent_dir=create_parent_dir)
 
495
 
 
496
    def non_atomic_put_bytes(self, relpath, bytes, mode=None,
 
497
                             create_parent_dir=False):
 
498
        def writer(fout):
 
499
            fout.write(bytes)
 
500
        self._non_atomic_put_helper(relpath, writer, mode=mode,
 
501
                                    create_parent_dir=create_parent_dir)
 
502
 
487
503
    def iter_files_recursive(self):
488
504
        """Walk the relative paths of all files in this transport."""
489
505
        queue = list(self.list_dir('.'))