15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
from fetch import greedy_fetch
24
23
import bzrlib.osutils
25
24
import bzrlib.revision
26
25
from bzrlib.merge_core import merge_flex, ApplyMerge3, BackupBeforeChange
27
26
from bzrlib.changeset import generate_changeset, ExceptionConflictHandler
28
27
from bzrlib.changeset import Inventory, Diff3Merge
29
from bzrlib.branch import find_branch
30
from bzrlib.errors import BzrCommandError, UnrelatedBranches
28
from bzrlib.branch import Branch
29
from bzrlib.errors import BzrCommandError, UnrelatedBranches, NoCommonAncestor
30
from bzrlib.errors import NoCommits
31
31
from bzrlib.delta import compare_trees
32
32
from bzrlib.trace import mutter, warning
33
from bzrlib.fetch import greedy_fetch
33
from bzrlib.fetch import greedy_fetch, fetch
34
34
from bzrlib.revision import is_ancestor
35
from bzrlib.osutils import rename
36
from bzrlib.revision import common_ancestor, MultipleRevisionSources
37
from bzrlib.errors import NoSuchRevision
36
40
# comments from abentley on irc: merge happens in two stages, each
37
41
# of which generates a changeset object
46
50
conflict that are not explicitly handled cause an exception and
47
51
terminate the merge.
49
def __init__(self, dir, ignore_zero=False):
50
ExceptionConflictHandler.__init__(self, dir)
53
def __init__(self, ignore_zero=False):
54
ExceptionConflictHandler.__init__(self)
52
56
self.ignore_zero = ignore_zero
107
111
self.add_suffix(this_path, ".THIS")
108
112
self.dump(base_lines, this_path+".BASE")
109
113
self.dump(other_lines, this_path+".OTHER")
110
os.rename(new_file, this_path)
114
rename(new_file, this_path)
111
115
self.conflict("Diff3 conflict encountered in %s" % this_path)
113
117
def new_contents_conflict(self, filename, other_contents):
134
138
def get_tree(treespec, temp_root, label, local_branch=None):
135
139
location, revno = treespec
136
branch = find_branch(location)
140
branch = Branch.open_containing(location)
137
141
if revno is None:
139
143
elif revno == -1:
140
144
revision = branch.last_revision()
142
revision = branch.lookup_revision(revno)
146
revision = branch.get_rev_id(revno)
143
147
return branch, get_revid_tree(branch, revision, temp_root, label,
235
239
If true, this_dir must have no uncommitted changes before the
237
all available ancestors of other_revision and base_revision are
242
All available ancestors of other_revision and base_revision are
238
243
automatically pulled into the branch.
240
from bzrlib.revision import common_ancestor, MultipleRevisionSources
241
from bzrlib.errors import NoSuchRevision
242
245
tempdir = tempfile.mkdtemp(prefix="bzr-")
244
247
if this_dir is None:
246
this_branch = find_branch(this_dir)
249
this_branch = Branch.open_containing(this_dir)
247
250
this_rev_id = this_branch.last_revision()
248
251
if this_rev_id is None:
249
252
raise BzrCommandError("This branch has no commits")
257
260
if other_revision[1] == -1:
258
261
other_rev_id = other_branch.last_revision()
262
if other_rev_id is None:
263
raise NoCommits(other_branch)
259
264
other_basis = other_rev_id
260
265
elif other_revision[1] is not None:
261
other_rev_id = other_branch.lookup_revision(other_revision[1])
266
other_rev_id = other_branch.get_rev_id(other_revision[1])
262
267
other_basis = other_rev_id
264
269
other_rev_id = None
265
270
other_basis = other_branch.last_revision()
271
if other_basis is None:
272
raise NoCommits(other_branch)
266
273
if base_revision == [None, None]:
267
base_rev_id = common_ancestor(this_rev_id, other_basis,
269
if base_rev_id is None:
275
base_rev_id = common_ancestor(this_rev_id, other_basis,
277
except NoCommonAncestor:
270
278
raise UnrelatedBranches()
271
279
base_tree = get_revid_tree(this_branch, base_rev_id, tempdir,
278
286
elif base_revision[1] is None:
279
287
base_rev_id = None
281
base_rev_id = base_branch.lookup_revision(base_revision[1])
282
if base_rev_id is not None:
283
base_is_ancestor = is_ancestor(this_rev_id, base_rev_id,
284
MultipleRevisionSources(this_branch,
287
base_is_ancestor = False
289
base_rev_id = base_branch.get_rev_id(base_revision[1])
290
fetch(from_branch=base_branch, to_branch=this_branch)
291
base_is_ancestor = is_ancestor(this_rev_id, base_rev_id,
288
293
if file_list is None:
289
294
interesting_ids = None
347
352
inv_changes = merge_flex(this_tree, base_tree, other_tree,
348
353
generate_cset_optimized, get_inventory,
349
MergeConflictHandler(base_tree.root,
350
ignore_zero=ignore_zero),
354
MergeConflictHandler(ignore_zero=ignore_zero),
351
355
merge_factory=merge_factory,
352
356
interesting_ids=interesting_ids)
360
assert path.startswith('./'), "path is %s" % path
364
assert path.startswith('.' + os.sep), "path is %s" % path
362
366
adjust_ids.append((path, id))
363
367
if len(adjust_ids) > 0: