Submitter | Sean Farley |
---|---|
Date | Aug. 19, 2014, 2:42 a.m. |
Message ID | <ed4082b72da600548d6c.1408408960@1.0.0.127.in-addr.arpa> |
Download | mbox | patch |
Permalink | /patch/5493/ |
State | Changes Requested |
Headers | show |
Comments
On 08/18/2014 07:42 PM, Sean Farley wrote: > # HG changeset patch > # User Sean Farley <sean.michael.farley@gmail.com> > # Date 1407357667 18000 > # Wed Aug 06 15:41:07 2014 -0500 > # Node ID ed4082b72da600548d6c9ecec102a3639e9bf3e0 > # Parent d1a21cc0bc4ba5764a1f8760fd041a91939b4d00 > merge: allow passing in a memctx with the rctx argument (RFC DO NOT COMMIT) > > This is a hack to do an in-memory merge without changing too much code. Future > patches will instead extract the parts of merge.update so that a cleaner > approach can be used without changing the signature of the function. I do not see this patch are specifically dirty. You are adding a new optional argument to specify the "destination" of the merge. Sounds like reasonable. Would just needs some documentation. > diff --git a/mercurial/merge.py b/mercurial/merge.py > --- a/mercurial/merge.py > +++ b/mercurial/merge.py > @@ -945,11 +945,11 @@ def recordupdates(repo, actions, branchm > repo.dirstate.copy(f0, f) > else: > repo.dirstate.normal(f) > > def update(repo, node, branchmerge, force, partial, ancestor=None, > - mergeancestor=False, labels=None): > + mergeancestor=False, labels=None, rctx=None): > """ > Perform a merge between the working directory and the given node > > node = the node to update to, or None if unspecified > branchmerge = whether to merge between branches > @@ -992,17 +992,22 @@ def update(repo, node, branchmerge, forc > """ > > onode = node > wlock = repo.wlock() > try: > - wc = repo[None] > + wc = rctx > + if wc is None: > + wc = repo[None] > pl = wc.parents() > p1 = pl[0] > pas = [None] > if ancestor: > pas = [repo[ancestor]] > > + if rctx is not None: > + node = pl[1] > + > if node is None: > # Here is where we should consider bookmarks, divergent bookmarks, > # foreground changesets (successors), and tip of current branch; > # but currently we are only checking the branch tips. > try: > @@ -1051,11 +1056,11 @@ def update(repo, node, branchmerge, forc > pas = [p1.ancestor(p2, warn=branchmerge)] > > fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2) > > ### check phase > - if not overwrite and len(pl) > 1: > + if not overwrite and len(pl) > 1 and rctx is None: > raise util.Abort(_("outstanding uncommitted merges")) > if branchmerge: > if pas == [p2]: > raise util.Abort(_("merging with a working directory ancestor" > " has no effect"))
Pierre-Yves David writes: > On 08/18/2014 07:42 PM, Sean Farley wrote: >> # HG changeset patch >> # User Sean Farley <sean.michael.farley@gmail.com> >> # Date 1407357667 18000 >> # Wed Aug 06 15:41:07 2014 -0500 >> # Node ID ed4082b72da600548d6c9ecec102a3639e9bf3e0 >> # Parent d1a21cc0bc4ba5764a1f8760fd041a91939b4d00 >> merge: allow passing in a memctx with the rctx argument (RFC DO NOT COMMIT) >> >> This is a hack to do an in-memory merge without changing too much code. Future >> patches will instead extract the parts of merge.update so that a cleaner >> approach can be used without changing the signature of the function. > > I do not see this patch are specifically dirty. You are adding a new > optional argument to specify the "destination" of the merge. Sounds like > reasonable. Would just needs some documentation. It's dirty because it was a quick hack on my part. It also changes the use of the function. I have since reworked this series so that we don't need this commit.
Patch
diff --git a/mercurial/merge.py b/mercurial/merge.py --- a/mercurial/merge.py +++ b/mercurial/merge.py @@ -945,11 +945,11 @@ def recordupdates(repo, actions, branchm repo.dirstate.copy(f0, f) else: repo.dirstate.normal(f) def update(repo, node, branchmerge, force, partial, ancestor=None, - mergeancestor=False, labels=None): + mergeancestor=False, labels=None, rctx=None): """ Perform a merge between the working directory and the given node node = the node to update to, or None if unspecified branchmerge = whether to merge between branches @@ -992,17 +992,22 @@ def update(repo, node, branchmerge, forc """ onode = node wlock = repo.wlock() try: - wc = repo[None] + wc = rctx + if wc is None: + wc = repo[None] pl = wc.parents() p1 = pl[0] pas = [None] if ancestor: pas = [repo[ancestor]] + if rctx is not None: + node = pl[1] + if node is None: # Here is where we should consider bookmarks, divergent bookmarks, # foreground changesets (successors), and tip of current branch; # but currently we are only checking the branch tips. try: @@ -1051,11 +1056,11 @@ def update(repo, node, branchmerge, forc pas = [p1.ancestor(p2, warn=branchmerge)] fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2) ### check phase - if not overwrite and len(pl) > 1: + if not overwrite and len(pl) > 1 and rctx is None: raise util.Abort(_("outstanding uncommitted merges")) if branchmerge: if pas == [p2]: raise util.Abort(_("merging with a working directory ancestor" " has no effect"))