~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/local.py

  • Committer: Robert Collins
  • Date: 2009-08-25 21:09:17 UTC
  • mto: This revision was merged to the branch mainline in revision 4650.
  • Revision ID: robertc@robertcollins.net-20090825210917-dq2i8k6n4z63pneh
Support shelve and unshelve on windows - bug 305006.

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
"""Transport for the local filesystem.
18
18
 
71
71
            self._local_base = ''
72
72
            super(LocalTransport, self).__init__(base)
73
73
            return
74
 
            
 
74
 
75
75
        super(LocalTransport, self).__init__(base)
76
76
        self._local_base = urlutils.local_path_from_url(base)
77
77
 
78
78
    def clone(self, offset=None):
79
79
        """Return a new LocalTransport with root at self.base + offset
80
 
        Because the local filesystem does not require a connection, 
 
80
        Because the local filesystem does not require a connection,
81
81
        we can just return a new object.
82
82
        """
83
83
        if offset is None:
109
109
        #       proper handling of stuff like
110
110
        path = osutils.normpath(osutils.pathjoin(
111
111
                    self._local_base, urlutils.unescape(relpath)))
 
112
        # on windows, our _local_base may or may not have a drive specified
 
113
        # (ie, it may be "/" or "c:/foo").
 
114
        # If 'relpath' is '/' we *always* get back an abspath without
 
115
        # the drive letter - but if our transport already has a drive letter,
 
116
        # we want our abspaths to have a drive letter too - so handle that
 
117
        # here.
 
118
        if (sys.platform == "win32" and self._local_base[1:2] == ":"
 
119
            and path == '/'):
 
120
            path = self._local_base[:3]
 
121
 
112
122
        return urlutils.local_path_to_url(path)
113
123
 
114
124
    def local_abspath(self, relpath):
161
171
 
162
172
        :param relpath: Location to put the contents, relative to base.
163
173
        :param f:       File-like object.
164
 
        :param mode: The mode for the newly created file, 
 
174
        :param mode: The mode for the newly created file,
165
175
                     None means just use the default
166
176
        """
167
177
 
194
204
        except (IOError, OSError),e:
195
205
            self._translate_error(e, path)
196
206
        try:
197
 
            fp.write(bytes)
 
207
            if bytes:
 
208
                fp.write(bytes)
198
209
            fp.commit()
199
210
        finally:
200
211
            fp.close()
275
286
    def put_bytes_non_atomic(self, relpath, bytes, mode=None,
276
287
                             create_parent_dir=False, dir_mode=None):
277
288
        def writer(fd):
278
 
            os.write(fd, bytes)
 
289
            if bytes:
 
290
                os.write(fd, bytes)
279
291
        self._put_non_atomic_helper(relpath, writer, mode=mode,
280
292
                                    create_parent_dir=create_parent_dir,
281
293
                                    dir_mode=dir_mode)
360
372
        file_abspath, fd = self._get_append_file(relpath, mode=mode)
361
373
        try:
362
374
            result = self._check_mode_and_size(file_abspath, fd, mode=mode)
363
 
            os.write(fd, bytes)
 
375
            if bytes:
 
376
                os.write(fd, bytes)
364
377
        finally:
365
378
            os.close(fd)
366
379
        return result
387
400
    def rename(self, rel_from, rel_to):
388
401
        path_from = self._abspath(rel_from)
389
402
        try:
390
 
            # *don't* call bzrlib.osutils.rename, because we want to 
 
403
            # *don't* call bzrlib.osutils.rename, because we want to
391
404
            # detect errors on rename
392
405
            os.rename(path_from, self._abspath(rel_to))
393
406
        except (IOError, OSError),e:
526
539
 
527
540
    def clone(self, offset=None):
528
541
        """Return a new LocalTransport with root at self.base + offset
529
 
        Because the local filesystem does not require a connection, 
 
542
        Because the local filesystem does not require a connection,
530
543
        we can just return a new object.
531
544
        """
532
545
        if offset is None:
543
556
 
544
557
class LocalURLServer(Server):
545
558
    """A pretend server for local transports, using file:// urls.
546
 
    
 
559
 
547
560
    Of course no actual server is required to access the local filesystem, so
548
561
    this just exists to tell the test code how to get to it.
549
562
    """
550
563
 
551
564
    def setUp(self):
552
565
        """Setup the server to service requests.
553
 
        
 
566
 
554
567
        :param decorated_transport: ignored by this implementation.
555
568
        """
556
569