~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-12-23 07:15:15 UTC
  • mfrom: (4916.1.15 45719-update-r)
  • Revision ID: pqm@pqm.ubuntu.com-20091223071515-trtmbl2kklwvbqrf
(mbp) add 'update -r' feature

Show diffs side-by-side

added added

removed removed

Lines of Context:
2191
2191
        """
2192
2192
        raise NotImplementedError(self.unlock)
2193
2193
 
2194
 
    def update(self, change_reporter=None, possible_transports=None):
 
2194
    _marker = object()
 
2195
 
 
2196
    def update(self, change_reporter=None, possible_transports=None,
 
2197
               revision=None, old_tip=_marker):
2195
2198
        """Update a working tree along its branch.
2196
2199
 
2197
2200
        This will update the branch if its bound too, which means we have
2215
2218
        - Merge current state -> basis tree of the master w.r.t. the old tree
2216
2219
          basis.
2217
2220
        - Do a 'normal' merge of the old branch basis if it is relevant.
 
2221
 
 
2222
        :param revision: The target revision to update to. Must be in the
 
2223
            revision history.
 
2224
        :param old_tip: If branch.update() has already been run, the value it
 
2225
            returned (old tip of the branch or None). _marker is used
 
2226
            otherwise.
2218
2227
        """
2219
2228
        if self.branch.get_bound_location() is not None:
2220
2229
            self.lock_write()
2221
 
            update_branch = True
 
2230
            update_branch = (old_tip is self._marker)
2222
2231
        else:
2223
2232
            self.lock_tree_write()
2224
2233
            update_branch = False
2226
2235
            if update_branch:
2227
2236
                old_tip = self.branch.update(possible_transports)
2228
2237
            else:
2229
 
                old_tip = None
2230
 
            return self._update_tree(old_tip, change_reporter)
 
2238
                if old_tip is self._marker:
 
2239
                    old_tip = None
 
2240
            return self._update_tree(old_tip, change_reporter, revision)
2231
2241
        finally:
2232
2242
            self.unlock()
2233
2243
 
2234
2244
    @needs_tree_write_lock
2235
 
    def _update_tree(self, old_tip=None, change_reporter=None):
 
2245
    def _update_tree(self, old_tip=None, change_reporter=None, revision=None):
2236
2246
        """Update a tree to the master branch.
2237
2247
 
2238
2248
        :param old_tip: if supplied, the previous tip revision the branch,
2253
2263
            last_rev = self.get_parent_ids()[0]
2254
2264
        except IndexError:
2255
2265
            last_rev = _mod_revision.NULL_REVISION
2256
 
        if last_rev != _mod_revision.ensure_null(self.branch.last_revision()):
2257
 
            # merge tree state up to new branch tip.
 
2266
        if revision is None:
 
2267
            revision = self.branch.last_revision()
 
2268
        else:
 
2269
            if revision not in self.branch.revision_history():
 
2270
                raise errors.NoSuchRevision(self.branch, revision)
 
2271
        if last_rev != _mod_revision.ensure_null(revision):
 
2272
            # merge tree state up to specified revision.
2258
2273
            basis = self.basis_tree()
2259
2274
            basis.lock_read()
2260
2275
            try:
2261
 
                to_tree = self.branch.basis_tree()
 
2276
                to_tree = self.branch.repository.revision_tree(revision)
2262
2277
                if basis.inventory.root is None:
2263
2278
                    self.set_root_id(to_tree.get_root_id())
2264
2279
                    self.flush()
2268
2283
                                      basis,
2269
2284
                                      this_tree=self,
2270
2285
                                      change_reporter=change_reporter)
 
2286
                self.set_last_revision(revision)
2271
2287
            finally:
2272
2288
                basis.unlock()
2273
2289
            # TODO - dedup parents list with things merged by pull ?
2274
2290
            # reuse the tree we've updated to to set the basis:
2275
 
            parent_trees = [(self.branch.last_revision(), to_tree)]
 
2291
            parent_trees = [(revision, to_tree)]
2276
2292
            merges = self.get_parent_ids()[1:]
2277
2293
            # Ideally we ask the tree for the trees here, that way the working
2278
2294
            # tree can decide whether to give us the entire tree or give us a
2308
2324
            #       should be able to remove this extra flush.
2309
2325
            self.flush()
2310
2326
            graph = self.branch.repository.get_graph()
2311
 
            base_rev_id = graph.find_unique_lca(self.branch.last_revision(),
2312
 
                                                old_tip)
 
2327
            base_rev_id = graph.find_unique_lca(revision, old_tip)
2313
2328
            base_tree = self.branch.repository.revision_tree(base_rev_id)
2314
2329
            other_tree = self.branch.repository.revision_tree(old_tip)
2315
2330
            result += merge.merge_inner(