changeset 816:8674b7803714

Warn on pushing unsynced repo or adding new heads By popular demand
author mpm@selenic.com
date Mon, 01 Aug 2005 23:17:22 -0800
parents 5a55e3011772
children cf1d9a01dd92
files mercurial/hg.py tests/test-push-warn tests/test-push-warn.out
diffstat 3 files changed, 92 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/hg.py	Sat Jul 30 09:01:59 2005 -0800
+++ b/mercurial/hg.py	Mon Aug 01 23:17:22 2005 -0800
@@ -1048,17 +1048,22 @@
 
         return nl
 
-    def findincoming(self, remote, base={}):
+    def findincoming(self, remote, base=None, heads=None):
         m = self.changelog.nodemap
         search = []
         fetch = []
         seen = {}
         seenbranch = {}
+        if base == None:
+            base = {}
 
         # assume we're closer to the tip than the root
         # and start by examining the heads
         self.ui.status("searching for changes\n")
-        heads = remote.heads()
+
+        if not heads:
+            heads = remote.heads()
+
         unknown = []
         for h in heads:
             if h not in m:
@@ -1160,9 +1165,11 @@
 
         return fetch
 
-    def findoutgoing(self, remote):
-        base = {}
-        self.findincoming(remote, base)
+    def findoutgoing(self, remote, base=None, heads=None):
+        if base == None:
+            base = {}
+            self.findincoming(remote, base, heads)
+
         remain = dict.fromkeys(self.changelog.nodemap)
 
         # prune everything remote has from the tree
@@ -1202,12 +1209,27 @@
         cg = remote.changegroup(fetch)
         return self.addchangegroup(cg)
 
-    def push(self, remote):
+    def push(self, remote, force=False):
         lock = remote.lock()
-        update = self.findoutgoing(remote)
+
+        base = {}
+        heads = remote.heads()
+        inc = self.findincoming(remote, base, heads)
+        if not force and inc:
+            self.ui.warn("abort: unsynced remote changes!\n")
+            self.ui.status("(did you forget to sync? use push -f to force)\n")
+            return 1
+
+        update = self.findoutgoing(remote, base)
         if not update:
             self.ui.status("no changes found\n")
             return 1
+        elif not force:
+            if len(heads) < len(self.changelog.heads()):
+                self.ui.warn("abort: push creates new remote branches!\n")
+                self.ui.status("(did you forget to merge?" +
+                               " use push -f to force)\n")
+                return 1
 
         cg = self.changegroup(update)
         return remote.addchangegroup(cg)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-warn	Mon Aug 01 23:17:22 2005 -0800
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+mkdir a
+cd a
+hg init
+echo foo > t1
+hg add t1
+hg commit -m "1" -d "0 0"
+
+cd ..
+hg clone a b
+
+cd a
+echo foo > t2
+hg add t2
+hg commit -m "2" -d "0 0"
+
+cd ../b
+echo foo > t3
+hg add t3
+hg commit -m "3" -d "0 0"
+
+hg push ../a
+hg pull ../a
+hg push ../a
+hg up -m
+hg commit -m "4" -d "0 0"
+hg push ../a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-warn.out	Mon Aug 01 23:17:22 2005 -0800
@@ -0,0 +1,35 @@
++ hg init
++ hg add t1
++ hg commit -m 1 -d 0 0
++ hg clone a b
++ hg add t2
++ hg commit -m 2 -d 0 0
++ hg add t3
++ hg commit -m 3 -d 0 0
++ hg push ../a
+pushing to ../a
+searching for changes
+abort: unsynced remote changes!
+(did you forget to sync? use push -f to force)
++ hg pull ../a
+pulling from ../a
+searching for changes
+adding changesets
+adding manifests
+adding file changes
+added 1 changesets with 1 changes to 1 files
+(run 'hg update' to get a working copy)
++ hg push ../a
+pushing to ../a
+searching for changes
+abort: push creates new remote branches!
+(did you forget to merge? use push -f to force)
++ hg up -m
++ hg commit -m 4 -d 0 0
++ hg push ../a
+pushing to ../a
+searching for changes
+adding changesets
+adding manifests
+adding file changes
+added 2 changesets with 2 changes to 2 files