~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/repository.py

Merge with bzr.dev after 0.8 release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
116
116
        result = self._all_possible_ids()
117
117
        return self._eliminate_revisions_not_present(result)
118
118
 
 
119
    def break_lock(self):
 
120
        """Break a lock if one is present from another instance.
 
121
 
 
122
        Uses the ui factory to ask for confirmation if the lock may be from
 
123
        an active process.
 
124
        """
 
125
        self.control_files.break_lock()
 
126
 
119
127
    @needs_read_lock
120
128
    def _eliminate_revisions_not_present(self, revision_ids):
121
129
        """Check every revision id in revision_ids to see if we have it.
298
306
                                                         signature,
299
307
                                                         self.get_transaction())
300
308
 
301
 
    def fileid_involved_between_revs(self, from_revid, to_revid):
302
 
        """Find file_id(s) which are involved in the changes between revisions.
303
 
 
304
 
        This determines the set of revisions which are involved, and then
305
 
        finds all file ids affected by those revisions.
306
 
        """
307
 
        w = self.get_inventory_weave()
308
 
        from_set = set(w.get_ancestry(from_revid))
309
 
        to_set = set(w.get_ancestry(to_revid))
310
 
        changed = to_set.difference(from_set)
311
 
        return self._fileid_involved_by_set(changed)
312
 
 
313
 
    def fileid_involved(self, last_revid=None):
314
 
        """Find all file_ids modified in the ancestry of last_revid.
315
 
 
316
 
        :param last_revid: If None, last_revision() will be used.
317
 
        """
318
 
        w = self.get_inventory_weave()
319
 
        if not last_revid:
320
 
            changed = set(w.versions())
321
 
        else:
322
 
            changed = set(w.get_ancestry(last_revid))
323
 
        return self._fileid_involved_by_set(changed)
324
 
 
325
 
    def fileid_involved_by_set(self, changes):
326
 
        """Find all file_ids modified by the set of revisions passed in.
327
 
 
328
 
        :param changes: A set() of revision ids
329
 
        """
330
 
        # TODO: jam 20060119 This line does *nothing*, remove it.
331
 
        #       or better yet, change _fileid_involved_by_set so
332
 
        #       that it takes the inventory weave, rather than
333
 
        #       pulling it out by itself.
334
 
        return self._fileid_involved_by_set(changes)
335
 
 
336
 
    def _fileid_involved_by_set(self, changes):
337
 
        """Find the set of file-ids affected by the set of revisions.
338
 
 
339
 
        :param changes: A set() of revision ids.
340
 
        :return: A set() of file ids.
341
 
        
342
 
        This peaks at the Weave, interpreting each line, looking to
343
 
        see if it mentions one of the revisions. And if so, includes
344
 
        the file id mentioned.
345
 
        This expects both the Weave format, and the serialization
346
 
        to have a single line per file/directory, and to have
347
 
        fileid="" and revision="" on that line.
 
309
    def fileids_altered_by_revision_ids(self, revision_ids):
 
310
        """Find the file ids and versions affected by revisions.
 
311
 
 
312
        :param revisions: an iterable containing revision ids.
 
313
        :return: a dictionary mapping altered file-ids to an iterable of
 
314
        revision_ids. Each altered file-ids has the exact revision_ids that
 
315
        altered it listed explicitly.
348
316
        """
349
317
        assert isinstance(self._format, (RepositoryFormat5,
350
318
                                         RepositoryFormat6,
351
319
                                         RepositoryFormat7,
352
320
                                         RepositoryFormatKnit1)), \
353
321
            "fileid_involved only supported for branches which store inventory as unnested xml"
354
 
 
 
322
        selected_revision_ids = set(revision_ids)
355
323
        w = self.get_inventory_weave()
356
 
        file_ids = set()
 
324
        result = {}
357
325
 
358
 
        # this code needs to read every line in every inventory for the
359
 
        # inventories [changes]. Seeing a line twice is ok. Seeing a line
360
 
        # not pesent in one of those inventories is unnecessary and not 
 
326
        # this code needs to read every new line in every inventory for the
 
327
        # inventories [revision_ids]. Seeing a line twice is ok. Seeing a line
 
328
        # not pesent in one of those inventories is unnecessary but not 
361
329
        # harmful because we are filtering by the revision id marker in the
362
 
        # inventory lines to only select file ids altered in one of those  
 
330
        # inventory lines : we only select file ids altered in one of those  
363
331
        # revisions. We dont need to see all lines in the inventory because
364
332
        # only those added in an inventory in rev X can contain a revision=X
365
333
        # line.
366
 
        for line in w.iter_lines_added_or_present_in_versions(changes):
 
334
        for line in w.iter_lines_added_or_present_in_versions(selected_revision_ids):
367
335
            start = line.find('file_id="')+9
368
336
            if start < 9: continue
369
337
            end = line.find('"', start)
370
338
            assert end>= 0
371
339
            file_id = _unescape_xml(line[start:end])
372
340
 
373
 
            # check if file_id is already present
374
 
            if file_id in file_ids: continue
375
 
 
376
341
            start = line.find('revision="')+10
377
342
            if start < 10: continue
378
343
            end = line.find('"', start)
379
344
            assert end>= 0
380
345
            revision_id = _unescape_xml(line[start:end])
381
 
            if revision_id in changes:
382
 
                file_ids.add(file_id)
383
 
        return file_ids
 
346
            if revision_id in selected_revision_ids:
 
347
                result.setdefault(file_id, set()).add(revision_id)
 
348
        return result
384
349
 
385
350
    @needs_read_lock
386
351
    def get_inventory_weave(self):
492
457
        raise NotImplementedError(self.is_shared)
493
458
 
494
459
    @needs_write_lock
495
 
    def reconcile(self):
 
460
    def reconcile(self, other=None, thorough=False):
496
461
        """Reconcile this repository."""
497
462
        from bzrlib.reconcile import RepoReconciler
498
 
        reconciler = RepoReconciler(self)
 
463
        reconciler = RepoReconciler(self, thorough=thorough)
499
464
        reconciler.reconcile()
500
465
        return reconciler
501
466
    
809
774
        return vf
810
775
 
811
776
    @needs_write_lock
812
 
    def reconcile(self):
 
777
    def reconcile(self, other=None, thorough=False):
813
778
        """Reconcile this repository."""
814
779
        from bzrlib.reconcile import KnitReconciler
815
 
        reconciler = KnitReconciler(self)
 
780
        reconciler = KnitReconciler(self, thorough=thorough)
816
781
        reconciler.reconcile()
817
782
        return reconciler
818
783