diff mercurial/commands.py @ 2019:ced2d3620f95

add merge command. means same thing as "update -m". repo.addchangegroup method now returns number of heads modified and added, so command line can tell whether update or merge needed. this makes tiny change to ssh wire protocol, but change is backwards compatible. pull command now returns 0 if no changes to pull.
author Vadim Gelfer <vadim.gelfer@gmail.com>
date Wed, 29 Mar 2006 10:27:16 -0800
parents 4c70b10f0418
children 00925397236c
line wrap: on
line diff
--- a/mercurial/commands.py	Wed Mar 29 12:45:33 2006 +0200
+++ b/mercurial/commands.py	Wed Mar 29 10:27:16 2006 -0800
@@ -1998,6 +1998,16 @@
     for f in files:
         ui.write("%40s %3s %s\n" % (hex(m[f]), mf[f] and "755" or "644", f))
 
+def merge(ui, repo, node=None, **opts):
+    """Merge working directory with another revision
+
+    Merge the contents of the current working directory and the
+    requested revision. Files that changed between either parent are
+    marked as changed for the next commit and a commit must be
+    performed before any further updates are allowed.
+    """
+    return update(ui, repo, node=node, merge=True, **opts)
+    
 def outgoing(ui, repo, dest="default-push", **opts):
     """show changesets not found in destination
 
@@ -2070,6 +2080,19 @@
         for name, path in ui.configitems("paths"):
             ui.write("%s = %s\n" % (name, path))
 
+def postincoming(ui, repo, modheads, optupdate):
+    if modheads == 0:
+        return
+    if optupdate:
+        if modheads == 1:
+            return update(ui, repo)
+        else:
+            ui.status(_("not updating, since new heads added\n"))
+    if modheads > 1:
+        ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
+    else:
+        ui.status(_("(run 'hg update' to get a working copy)\n"))
+    
 def pull(ui, repo, source="default", **opts):
     """pull changes from the specified source
 
@@ -2114,14 +2137,8 @@
         raise util.Abort(_("pull -r doesn't work for remote repositories yet"))
     elif opts['rev']:
         revs = [other.lookup(rev) for rev in opts['rev']]
-    r = repo.pull(other, heads=revs, force=opts['force'])
-    if not r:
-        if opts['update']:
-            return update(ui, repo)
-        else:
-            ui.status(_("(run 'hg update' to get a working copy)\n"))
-
-    return r
+    modheads = repo.pull(other, heads=revs, force=opts['force'])
+    return postincoming(ui, repo, modheads, opts['update'])
 
 def push(ui, repo, dest="default-push", **opts):
     """push changes to the specified destination
@@ -2158,7 +2175,7 @@
     if opts['rev']:
         revs = [repo.lookup(rev) for rev in opts['rev']]
     r = repo.push(other, opts['force'], revs=revs)
-    return r
+    return r == 0
 
 def rawcommit(ui, repo, *flist, **rc):
     """raw commit interface (DEPRECATED)
@@ -2387,7 +2404,7 @@
                 respond("")
 
                 r = repo.addchangegroup(fin)
-                respond("")
+                respond(str(r))
 
     optlist = "name templates style address port ipv6 accesslog errorlog"
     for o in optlist.split():
@@ -2599,13 +2616,8 @@
         raise util.Abort(_("%s: unknown bundle compression type")
                          % fname)
     gen = generator(util.filechunkiter(f, 4096))
-    if repo.addchangegroup(util.chunkbuffer(gen)):
-        return 1
-
-    if opts['update']:
-        return update(ui, repo)
-    else:
-        ui.status(_("(run 'hg update' to get a working copy)\n"))
+    modheads = repo.addchangegroup(util.chunkbuffer(gen))
+    return postincoming(ui, repo, modheads, opts['update'])
 
 def undo(ui, repo):
     """undo the last commit or pull
@@ -2849,6 +2861,13 @@
           ('X', 'exclude', [], _('exclude names matching the given patterns'))],
          _('hg log [OPTION]... [FILE]')),
     "manifest": (manifest, [], _('hg manifest [REV]')),
+    "merge":
+    (merge,
+     [('b', 'branch', '', _('merge with head of a specific branch')),
+      ('', 'style', '', _('display using template map file')),
+      ('f', 'force', None, _('force a merge with outstanding changes')),
+      ('', 'template', '', _('display with template'))],
+     _('hg merge [-b TAG] [-f] [REV]')),
     "outgoing|out": (outgoing,
          [('M', 'no-merges', None, _('do not show merges')),
           ('f', 'force', None,