Index: /mergebot/trunk/utils/test.py
===================================================================
--- /mergebot/trunk/utils/test.py	(revision 62)
+++ /mergebot/trunk/utils/test.py	(revision 63)
@@ -256,4 +256,9 @@
         self.assertEqual(retval, 0, "svn prposet failed with error %s" % (retval))
         
+    def propdel(self, propname, filename):
+        retval = call(['svn', 'propdel', propname, filename],
+            cwd=self.get_workdir(),
+            stdout=logfile, stderr=logfile)
+        self.assertEqual(retval, 0, "svn prposet failed with error %s" % (retval))
 
 
@@ -397,4 +402,58 @@
 
 
+class MergeBotTestMergeWithPropertyBranchDeleteConflict(FunctionalSvnTestCaseSetup):
+    def runTest(self):
+        """Verify that the 'merge' button detects property deleted on branch and modified on trunk"""
+        ticket_id = self._tester.create_ticket(summary=self.__class__.__name__,
+            info={'component':'stuff', 'version':'trunk'})
+        basename = self.__class__.__name__
+
+        self.checkout()
+        self.propset('svn:ignore', basename, '.')
+        self.commit('set property on trunk')
+
+        # create the branch
+        self._tester.branch(ticket_id, 'stuff')
+
+        # modify the property on trunk
+        self.propset('svn:ignore', basename + '\ntrunk', '.')
+        self.commit('Modify the property on trunk')
+
+        # delete the property on the branch
+        self.switch(ticket_id)
+        self.propdel('svn:ignore', '.')
+        self.commit('Delete the property on branch')
+
+        # merge, make sure it shows a conflict
+        self._tester.merge_conflict(ticket_id, 'stuff')
+
+
+class MergeBotTestMergeWithPropertyTrunkDeleteConflict(FunctionalSvnTestCaseSetup):
+    def runTest(self):
+        """Verify that the 'merge' button detects property deleted on trunk and modified on branch"""
+        ticket_id = self._tester.create_ticket(summary=self.__class__.__name__,
+            info={'component':'stuff', 'version':'trunk'})
+        basename = self.__class__.__name__
+
+        self.checkout()
+        self.propset('svn:ignore', basename, '.')
+        self.commit('set property on trunk')
+
+        # create the branch
+        self._tester.branch(ticket_id, 'stuff')
+
+        # delete the property on trunk
+        self.propdel('svn:ignore', '.')
+        self.commit('Delete the property on trunk')
+
+        # delete the property on the branch
+        self.switch(ticket_id)
+        self.propset('svn:ignore', basename + '\nbranch', '.')
+        self.commit('Modify the property on branch')
+
+        # merge, make sure it shows a conflict
+        self._tester.merge_conflict(ticket_id, 'stuff')
+
+
 class MergeBotTestMergeWithBranchRenameConflict(FunctionalSvnTestCaseSetup):
     def runTest(self):
@@ -544,4 +603,58 @@
 
         # modify the property on the branch
+        self.switch(ticket_id)
+        self.propset('svn:ignore', basename + '\nbranch', '.')
+        self.commit('Modify the property on branch')
+
+        # rebranch, make sure it shows a conflict
+        self._tester.rebranch_conflict(ticket_id, 'stuff')
+
+
+class MergeBotTestRebranchWithPropertyBranchDeleteConflict(FunctionalSvnTestCaseSetup):
+    def runTest(self):
+        """Verify that the 'rebranch' button detects property deleted on branch and modified on trunk"""
+        ticket_id = self._tester.create_ticket(summary=self.__class__.__name__,
+            info={'component':'stuff', 'version':'trunk'})
+        basename = self.__class__.__name__
+
+        self.checkout()
+        self.propset('svn:ignore', basename, '.')
+        self.commit('set property on trunk')
+
+        # create the branch
+        self._tester.branch(ticket_id, 'stuff')
+
+        # modify the property on trunk
+        self.propset('svn:ignore', basename + '\ntrunk', '.')
+        self.commit('Modify the property on trunk')
+
+        # delete the property on the branch
+        self.switch(ticket_id)
+        self.propdel('svn:ignore', '.')
+        self.commit('Delete the property on branch')
+
+        # rebranch, make sure it shows a conflict
+        self._tester.rebranch_conflict(ticket_id, 'stuff')
+
+
+class MergeBotTestRebranchWithPropertyTrunkDeleteConflict(FunctionalSvnTestCaseSetup):
+    def runTest(self):
+        """Verify that the 'rebranch' button detects property deleted on trunk and modified on branch"""
+        ticket_id = self._tester.create_ticket(summary=self.__class__.__name__,
+            info={'component':'stuff', 'version':'trunk'})
+        basename = self.__class__.__name__
+
+        self.checkout()
+        self.propset('svn:ignore', basename, '.')
+        self.commit('set property on trunk')
+
+        # create the branch
+        self._tester.branch(ticket_id, 'stuff')
+
+        # delete the property on trunk
+        self.propdel('svn:ignore', '.')
+        self.commit('Delete the property on trunk')
+
+        # delete the property on the branch
         self.switch(ticket_id)
         self.propset('svn:ignore', basename + '\nbranch', '.')
@@ -651,4 +764,6 @@
     suite.addTest(MergeBotTestRebranchWithBranchRenameConflict())
     suite.addTest(MergeBotTestRebranchWithTrunkRenameConflict())
+    suite.addTest(MergeBotTestRebranchWithPropertyBranchDeleteConflict())
+    suite.addTest(MergeBotTestRebranchWithPropertyTrunkDeleteConflict())
     suite.addTest(MergeBotTestMergeWithChange())
     suite.addTest(MergeBotTestMergeWithChangeAndTrunkChange())
@@ -657,4 +772,6 @@
     suite.addTest(MergeBotTestMergeWithBranchRenameConflict())
     suite.addTest(MergeBotTestMergeWithTrunkRenameConflict())
+    suite.addTest(MergeBotTestMergeWithPropertyBranchDeleteConflict())
+    suite.addTest(MergeBotTestMergeWithPropertyTrunkDeleteConflict())
     suite.addTest(MergeBotTestSingleUseCase())
     return suite
