~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/branch.py

  • Committer: mbp at sourcefrog
  • Date: 2005-03-23 03:09:50 UTC
  • Revision ID: mbp@sourcefrog.net-20050323030950-c762f4c38f99dbd9
Prepare for smart recursive add.

- New Inventory.add_path, so that callers don't need to know so much
  about path lookup.

- Make gen_file_id public.

- New add module and smart_add function; does previous add operations
  more cleanly but not recursive mode yet.

- New warning() function.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005 Canonical Ltd
 
2
 
1
3
# This program is free software; you can redistribute it and/or modify
2
4
# it under the terms of the GNU General Public License as published by
3
5
# the Free Software Foundation; either version 2 of the License, or
202
204
        will be committed to the next revision.
203
205
        """
204
206
        ## TODO: factor out to atomicfile?  is rename safe on windows?
 
207
        ## TODO: Maybe some kind of clean/dirty marker on inventory?
205
208
        tmpfname = self.controlfilename('inventory.tmp')
206
209
        tmpf = file(tmpfname, 'w')
207
210
        inv.write_xml(tmpf)
272
275
                
273
276
            fullpath = os.path.normpath(self.abspath(f))
274
277
 
275
 
            if isfile(fullpath):
276
 
                kind = 'file'
277
 
            elif isdir(fullpath):
278
 
                kind = 'directory'
279
 
            else:
280
 
                bailout('cannot add: not a regular file or directory: %s' % quotefn(f))
281
 
 
282
 
            if len(fp) > 1:
283
 
                parent_name = joinpath(fp[:-1])
284
 
                mutter("lookup parent %r" % parent_name)
285
 
                parent_id = inv.path2id(parent_name)
286
 
                if parent_id == None:
287
 
                    bailout("cannot add: parent %r is not versioned"
288
 
                            % joinpath(fp[:-1]))
289
 
            else:
290
 
                parent_id = None
291
 
 
292
 
            file_id = _gen_file_id(fp[-1])
293
 
            inv.add(InventoryEntry(file_id, fp[-1], kind=kind, parent_id=parent_id))
 
278
            try:
 
279
                kind = file_kind(fullpath)
 
280
            except OSError:
 
281
                # maybe something better?
 
282
                bailout('cannot add: not a regular file or directory: %s' % quotefn(f))
 
283
            
 
284
            if kind != 'file' and kind != 'directory':
 
285
                bailout('cannot add: not a regular file or directory: %s' % quotefn(f))
 
286
 
 
287
            file_id = gen_file_id(f)
 
288
            inv.add_path(f, kind=kind, file_id=file_id)
 
289
 
294
290
            if verbose:
295
291
                show_status('A', kind, quotefn(f))
296
292
                
297
 
            mutter("add file %s file_id:{%s} kind=%r parent_id={%s}"
298
 
                   % (f, file_id, kind, parent_id))
 
293
            mutter("add file %s file_id:{%s} kind=%r" % (f, file_id, kind))
 
294
            
299
295
        self._write_inventory(inv)
300
296
 
301
297
 
476
472
                           entry.text_id)
477
473
                    
478
474
                else:
479
 
                    entry.text_id = _gen_file_id(entry.name)
 
475
                    entry.text_id = gen_file_id(entry.name)
480
476
                    self.text_store.add(content, entry.text_id)
481
477
                    mutter('    stored with text_id {%s}' % entry.text_id)
482
478
                    if verbose:
798
794
        ## mutter('check %r for control file' % ((head, tail), ))
799
795
        if tail == bzrlib.BZRDIR:
800
796
            return True
 
797
        if filename == head:
 
798
            break
801
799
        filename = head
802
800
    return False
803
801
 
810
808
    return s
811
809
 
812
810
 
813
 
def _gen_file_id(name):
 
811
def gen_file_id(name):
814
812
    """Return new file id.
815
813
 
816
814
    This should probably generate proper UUIDs, but for the moment we
817
815
    cope with just randomness because running uuidgen every time is
818
816
    slow."""
819
 
    assert '/' not in name
820
 
    while name[0] == '.':
821
 
        name = name[1:]
 
817
    idx = name.rfind('/')
 
818
    if idx != -1:
 
819
        name = name[idx+1 : ]
 
820
 
 
821
    name = name.lstrip('.')
 
822
 
822
823
    s = hexlify(rand_bytes(8))
823
824
    return '-'.join((name, compact_date(time.time()), s))
824
825