summaryrefslogtreecommitdiff
path: root/tests/test_head_tracking.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_head_tracking.py')
-rw-r--r--tests/test_head_tracking.py259
1 files changed, 259 insertions, 0 deletions
diff --git a/tests/test_head_tracking.py b/tests/test_head_tracking.py
new file mode 100644
index 0000000..19f6c68
--- /dev/null
+++ b/tests/test_head_tracking.py
@@ -0,0 +1,259 @@
+# Copyright (C) 2009 Canonical Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+"""Test tracking of heads"""
+
+from cStringIO import StringIO
+
+from fastimport import (
+ commands,
+ parser,
+ )
+
+import testtools
+
+from bzrlib.plugins.fastimport.reftracker import (
+ RefTracker,
+ )
+
+
+# A sample input stream that only adds files to a branch
+_SAMPLE_MAINLINE = \
+"""blob
+mark :1
+data 9
+Welcome!
+commit refs/heads/master
+mark :100
+committer a <b@c> 1234798653 +0000
+data 4
+test
+M 644 :1 doc/README.txt
+blob
+mark :2
+data 17
+Life
+is
+good ...
+commit refs/heads/master
+mark :101
+committer a <b@c> 1234798653 +0000
+data 8
+test
+ing
+from :100
+M 644 :2 NEWS
+blob
+mark :3
+data 19
+Welcome!
+my friend
+blob
+mark :4
+data 11
+== Docs ==
+commit refs/heads/master
+mark :102
+committer d <b@c> 1234798653 +0000
+data 8
+test
+ing
+from :101
+M 644 :3 doc/README.txt
+M 644 :4 doc/index.txt
+"""
+
+# A sample input stream that adds files to two branches
+_SAMPLE_TWO_HEADS = \
+"""blob
+mark :1
+data 9
+Welcome!
+commit refs/heads/master
+mark :100
+committer a <b@c> 1234798653 +0000
+data 4
+test
+M 644 :1 doc/README.txt
+blob
+mark :2
+data 17
+Life
+is
+good ...
+commit refs/heads/mybranch
+mark :101
+committer a <b@c> 1234798653 +0000
+data 8
+test
+ing
+from :100
+M 644 :2 NEWS
+blob
+mark :3
+data 19
+Welcome!
+my friend
+blob
+mark :4
+data 11
+== Docs ==
+commit refs/heads/master
+mark :102
+committer d <b@c> 1234798653 +0000
+data 8
+test
+ing
+from :100
+M 644 :3 doc/README.txt
+M 644 :4 doc/index.txt
+"""
+
+# A sample input stream that adds files to two branches
+_SAMPLE_TWO_BRANCHES_MERGED = \
+"""blob
+mark :1
+data 9
+Welcome!
+commit refs/heads/master
+mark :100
+committer a <b@c> 1234798653 +0000
+data 4
+test
+M 644 :1 doc/README.txt
+blob
+mark :2
+data 17
+Life
+is
+good ...
+commit refs/heads/mybranch
+mark :101
+committer a <b@c> 1234798653 +0000
+data 8
+test
+ing
+from :100
+M 644 :2 NEWS
+blob
+mark :3
+data 19
+Welcome!
+my friend
+blob
+mark :4
+data 11
+== Docs ==
+commit refs/heads/master
+mark :102
+committer d <b@c> 1234798653 +0000
+data 8
+test
+ing
+from :100
+M 644 :3 doc/README.txt
+M 644 :4 doc/index.txt
+commit refs/heads/master
+mark :103
+committer d <b@c> 1234798653 +0000
+data 8
+test
+ing
+from :102
+merge :101
+D doc/index.txt
+"""
+
+# A sample input stream that contains a reset
+_SAMPLE_RESET = \
+"""blob
+mark :1
+data 9
+Welcome!
+commit refs/heads/master
+mark :100
+committer a <b@c> 1234798653 +0000
+data 4
+test
+M 644 :1 doc/README.txt
+reset refs/remotes/origin/master
+from :100
+"""
+
+# A sample input stream that contains a reset and more commits
+_SAMPLE_RESET_WITH_MORE_COMMITS = \
+"""blob
+mark :1
+data 9
+Welcome!
+commit refs/heads/master
+mark :100
+committer a <b@c> 1234798653 +0000
+data 4
+test
+M 644 :1 doc/README.txt
+reset refs/remotes/origin/master
+from :100
+commit refs/remotes/origin/master
+mark :101
+committer d <b@c> 1234798653 +0000
+data 8
+test
+ing
+from :100
+D doc/README.txt
+"""
+
+class TestHeadTracking(testtools.TestCase):
+
+ def assertHeads(self, input, expected):
+ s = StringIO(input)
+ p = parser.ImportParser(s)
+ reftracker = RefTracker()
+ for cmd in p.iter_commands():
+ if isinstance(cmd, commands.CommitCommand):
+ reftracker.track_heads(cmd)
+ # eat the file commands
+ list(cmd.iter_files())
+ elif isinstance(cmd, commands.ResetCommand):
+ if cmd.from_ is not None:
+ reftracker.track_heads_for_ref(cmd.ref, cmd.from_)
+ self.assertEqual(reftracker.heads, expected)
+
+ def test_mainline(self):
+ self.assertHeads(_SAMPLE_MAINLINE, {
+ ':102': set(['refs/heads/master']),
+ })
+
+ def test_two_heads(self):
+ self.assertHeads(_SAMPLE_TWO_HEADS, {
+ ':101': set(['refs/heads/mybranch']),
+ ':102': set(['refs/heads/master']),
+ })
+
+ def test_two_branches_merged(self):
+ self.assertHeads(_SAMPLE_TWO_BRANCHES_MERGED, {
+ ':103': set(['refs/heads/master']),
+ })
+
+ def test_reset(self):
+ self.assertHeads(_SAMPLE_RESET, {
+ ':100': set(['refs/heads/master', 'refs/remotes/origin/master']),
+ })
+
+ def test_reset_with_more_commits(self):
+ self.assertHeads(_SAMPLE_RESET_WITH_MORE_COMMITS, {
+ ':101': set(['refs/remotes/origin/master']),
+ })