def test_file(self): f = File() f.parents = ('a474d1cb79c2f90dccc2bef320e293b89aae7079', '49d8cbb15ce257920447006b46978b7af980a979') self.assertEqual(f.parent1, 'a474d1cb79c2f90dccc2bef320e293b89aae7079') self.assertEqual(f.parent2, '49d8cbb15ce257920447006b46978b7af980a979') f.parents = ('a474d1cb79c2f90dccc2bef320e293b89aae7079', ) self.assertEqual(f.parent1, 'a474d1cb79c2f90dccc2bef320e293b89aae7079') self.assertEqual(f.parent2, NULL_NODE_ID) f.parents = () self.assertEqual(f.parent1, NULL_NODE_ID) self.assertEqual(f.parent2, NULL_NODE_ID) f.content = '' self.assertEqual(f.raw_data, '') f.metadata = { 'copy': 'foo', 'copyrev': 'a474d1cb79c2f90dccc2bef320e293b89aae7079', } data = ('\1\n' + 'copy: foo\n' + 'copyrev: a474d1cb79c2f90dccc2bef320e293b89aae7079\n' + '\1\n') self.assertEqual(f.raw_data, data) f.content = 'foo' self.assertEqual(f.raw_data, data + 'foo') f.metadata = {} self.assertEqual(f.raw_data, 'foo')
def test_file(self): f = File() f.parents = ('a474d1cb79c2f90dccc2bef320e293b89aae7079', '49d8cbb15ce257920447006b46978b7af980a979') self.assertEqual(f.parent1, 'a474d1cb79c2f90dccc2bef320e293b89aae7079') self.assertEqual(f.parent2, '49d8cbb15ce257920447006b46978b7af980a979') f.parents = ('a474d1cb79c2f90dccc2bef320e293b89aae7079',) self.assertEqual(f.parent1, 'a474d1cb79c2f90dccc2bef320e293b89aae7079') self.assertEqual(f.parent2, NULL_NODE_ID) f.parents = () self.assertEqual(f.parent1, NULL_NODE_ID) self.assertEqual(f.parent2, NULL_NODE_ID) f.content = '' self.assertEqual(f.raw_data, '') f.metadata = { 'copy': 'foo', 'copyrev': 'a474d1cb79c2f90dccc2bef320e293b89aae7079', } data = ( '\1\n' + 'copy: foo\n' + 'copyrev: a474d1cb79c2f90dccc2bef320e293b89aae7079\n' + '\1\n') self.assertEqual(f.raw_data, data) f.content = 'foo' self.assertEqual(f.raw_data, data + 'foo') f.metadata = {} self.assertEqual(f.raw_data, 'foo')
def test_file(self): f = File() f.content = 'foo' self.assertEqual(f.sha1, '49d8cbb15ce257920447006b46978b7af980a979') chunk = f.to_chunk(self.RevChunk) self.assertEqual( chunk, unhexlify('49d8cbb15ce257920447006b46978b7af980a979') + '\0' * 20 + '\0' * 20 + self.delta_node('\0' * 20) + '\0' * 20 + '\0' * 4 + '\0' * 4 + ('\0' * 3 + '\3') + 'foo') f = File.from_chunk(chunk) self.assertEqual(f.node, '49d8cbb15ce257920447006b46978b7af980a979') self.assertEqual(f.parent1, NULL_NODE_ID) self.assertEqual(f.parent2, NULL_NODE_ID) self.assertEqual(f.changeset, NULL_NODE_ID) self.assertEqual(f.metadata, {}) self.assertEqual(f.content, 'foo') f2 = File() f2.parent1 = f.node f2.content = 'barbaz' self.assertEqual(f2.sha1, 'a474d1cb79c2f90dccc2bef320e293b89aae7079') chunk = f2.to_chunk(self.RevChunk) self.assertEqual( chunk, unhexlify('a474d1cb79c2f90dccc2bef320e293b89aae7079') + unhexlify('49d8cbb15ce257920447006b46978b7af980a979') + '\0' * 20 + self.delta_node('\0' * 20) + '\0' * 20 + '\0' * 4 + '\0' * 4 + ('\0' * 3 + '\6') + 'barbaz') chunk = f2.to_chunk(self.RevChunk, f) self.assertEqual( chunk, unhexlify('a474d1cb79c2f90dccc2bef320e293b89aae7079') + unhexlify('49d8cbb15ce257920447006b46978b7af980a979') + '\0' * 20 + self.delta_node( unhexlify('49d8cbb15ce257920447006b46978b7af980a979')) + '\0' * 20 + '\0' * 4 + ('\0' * 3 + '\3') + ('\0' * 3 + '\6') + 'barbaz') with self.assertRaises(AssertionError): File.from_chunk(chunk) f2 = File.from_chunk(chunk, f) self.assertEqual(f2.node, 'a474d1cb79c2f90dccc2bef320e293b89aae7079') self.assertEqual(f2.parent1, '49d8cbb15ce257920447006b46978b7af980a979') self.assertEqual(f2.parent2, NULL_NODE_ID) self.assertEqual(f2.changeset, NULL_NODE_ID) self.assertEqual(f2.metadata, {}) self.assertEqual(f2.content, 'barbaz') f3 = File() f3.content = f2.content f3.metadata = { 'copy': 'foo', 'copyrev': 'a474d1cb79c2f90dccc2bef320e293b89aae7079', } self.assertEqual(f3.sha1, '5b783e760678fc60083be1b0844865c025dbe062') chunk = f3.to_chunk(self.RevChunk, f2) self.assertEqual( chunk, unhexlify('5b783e760678fc60083be1b0844865c025dbe062') + '\0' * 20 + '\0' * 20 + self.delta_node( unhexlify('a474d1cb79c2f90dccc2bef320e293b89aae7079')) + '\0' * 20 + '\0' * 4 + '\0' * 4 + ('\0' * 3 + '\x40') + '\1\n' + 'copy: foo\n' + 'copyrev: a474d1cb79c2f90dccc2bef320e293b89aae7079\n' + '\1\n') with self.assertRaises(AssertionError): File.from_chunk(chunk) with self.assertRaises(AssertionError): File.from_chunk(chunk, f) f3 = File.from_chunk(chunk, f2) self.assertEqual(f3.node, '5b783e760678fc60083be1b0844865c025dbe062') self.assertEqual(f3.parent1, NULL_NODE_ID) self.assertEqual(f3.parent2, NULL_NODE_ID) self.assertEqual(f3.changeset, NULL_NODE_ID) self.assertEqual(f3.metadata, { 'copy': 'foo', 'copyrev': 'a474d1cb79c2f90dccc2bef320e293b89aae7079', }) self.assertEqual(f3.content, 'barbaz') chunk = f3.to_chunk(self.RevChunk, f) self.assertEqual( chunk, unhexlify('5b783e760678fc60083be1b0844865c025dbe062') + '\0' * 20 + '\0' * 20 + self.delta_node( unhexlify('49d8cbb15ce257920447006b46978b7af980a979')) + '\0' * 20 + '\0' * 4 + ('\0' * 3 + '\3') + ('\0' * 3 + '\x46') + '\1\n' + 'copy: foo\n' + 'copyrev: a474d1cb79c2f90dccc2bef320e293b89aae7079\n' + '\1\n' + 'barbaz') with self.assertRaises(AssertionError): File.from_chunk(chunk) with self.assertRaises(AssertionError): File.from_chunk(chunk, f2) f3 = File.from_chunk(chunk, f) self.assertEqual(f3.node, '5b783e760678fc60083be1b0844865c025dbe062') self.assertEqual(f3.parent1, NULL_NODE_ID) self.assertEqual(f3.parent2, NULL_NODE_ID) self.assertEqual(f3.changeset, NULL_NODE_ID) self.assertEqual(f3.metadata, { 'copy': 'foo', 'copyrev': 'a474d1cb79c2f90dccc2bef320e293b89aae7079', }) self.assertEqual(f3.content, 'barbaz')
def test_file(self): f = File() f.content = 'foo' self.assertEqual(f.sha1, '49d8cbb15ce257920447006b46978b7af980a979') chunk = f.to_chunk(self.RevChunk) self.assertEqual( chunk, unhexlify('49d8cbb15ce257920447006b46978b7af980a979') + '\0' * 20 + '\0' * 20 + self.delta_node('\0' * 20) + '\0' * 20 + '\0' * 4 + '\0' * 4 + ('\0' * 3 + '\3') + 'foo' ) f = File.from_chunk(chunk) self.assertEqual(f.node, '49d8cbb15ce257920447006b46978b7af980a979') self.assertEqual(f.parent1, NULL_NODE_ID) self.assertEqual(f.parent2, NULL_NODE_ID) self.assertEqual(f.changeset, NULL_NODE_ID) self.assertEqual(f.metadata, {}) self.assertEqual(f.content, 'foo') f2 = File() f2.parent1 = f.node f2.content = 'barbaz' self.assertEqual(f2.sha1, 'a474d1cb79c2f90dccc2bef320e293b89aae7079') chunk = f2.to_chunk(self.RevChunk) self.assertEqual( chunk, unhexlify('a474d1cb79c2f90dccc2bef320e293b89aae7079') + unhexlify('49d8cbb15ce257920447006b46978b7af980a979') + '\0' * 20 + self.delta_node('\0' * 20) + '\0' * 20 + '\0' * 4 + '\0' * 4 + ('\0' * 3 + '\6') + 'barbaz' ) chunk = f2.to_chunk(self.RevChunk, f) self.assertEqual( chunk, unhexlify('a474d1cb79c2f90dccc2bef320e293b89aae7079') + unhexlify('49d8cbb15ce257920447006b46978b7af980a979') + '\0' * 20 + self.delta_node(unhexlify( '49d8cbb15ce257920447006b46978b7af980a979')) + '\0' * 20 + '\0' * 4 + ('\0' * 3 + '\3') + ('\0' * 3 + '\6') + 'barbaz' ) with self.assertRaises(AssertionError): File.from_chunk(chunk) f2 = File.from_chunk(chunk, f) self.assertEqual(f2.node, 'a474d1cb79c2f90dccc2bef320e293b89aae7079') self.assertEqual(f2.parent1, '49d8cbb15ce257920447006b46978b7af980a979') self.assertEqual(f2.parent2, NULL_NODE_ID) self.assertEqual(f2.changeset, NULL_NODE_ID) self.assertEqual(f2.metadata, {}) self.assertEqual(f2.content, 'barbaz') f3 = File() f3.content = f2.content f3.metadata = { 'copy': 'foo', 'copyrev': 'a474d1cb79c2f90dccc2bef320e293b89aae7079', } self.assertEqual(f3.sha1, '5b783e760678fc60083be1b0844865c025dbe062') chunk = f3.to_chunk(self.RevChunk, f2) self.assertEqual( chunk, unhexlify('5b783e760678fc60083be1b0844865c025dbe062') + '\0' * 20 + '\0' * 20 + self.delta_node(unhexlify( 'a474d1cb79c2f90dccc2bef320e293b89aae7079')) + '\0' * 20 + '\0' * 4 + '\0' * 4 + ('\0' * 3 + '\x40') + '\1\n' + 'copy: foo\n' + 'copyrev: a474d1cb79c2f90dccc2bef320e293b89aae7079\n' + '\1\n' ) with self.assertRaises(AssertionError): File.from_chunk(chunk) with self.assertRaises(AssertionError): File.from_chunk(chunk, f) f3 = File.from_chunk(chunk, f2) self.assertEqual(f3.node, '5b783e760678fc60083be1b0844865c025dbe062') self.assertEqual(f3.parent1, NULL_NODE_ID) self.assertEqual(f3.parent2, NULL_NODE_ID) self.assertEqual(f3.changeset, NULL_NODE_ID) self.assertEqual(f3.metadata, { 'copy': 'foo', 'copyrev': 'a474d1cb79c2f90dccc2bef320e293b89aae7079', }) self.assertEqual(f3.content, 'barbaz') chunk = f3.to_chunk(self.RevChunk, f) self.assertEqual( chunk, unhexlify('5b783e760678fc60083be1b0844865c025dbe062') + '\0' * 20 + '\0' * 20 + self.delta_node(unhexlify( '49d8cbb15ce257920447006b46978b7af980a979')) + '\0' * 20 + '\0' * 4 + ('\0' * 3 + '\3') + ('\0' * 3 + '\x46') + '\1\n' + 'copy: foo\n' + 'copyrev: a474d1cb79c2f90dccc2bef320e293b89aae7079\n' + '\1\n' + 'barbaz' ) with self.assertRaises(AssertionError): File.from_chunk(chunk) with self.assertRaises(AssertionError): File.from_chunk(chunk, f2) f3 = File.from_chunk(chunk, f) self.assertEqual(f3.node, '5b783e760678fc60083be1b0844865c025dbe062') self.assertEqual(f3.parent1, NULL_NODE_ID) self.assertEqual(f3.parent2, NULL_NODE_ID) self.assertEqual(f3.changeset, NULL_NODE_ID) self.assertEqual(f3.metadata, { 'copy': 'foo', 'copyrev': 'a474d1cb79c2f90dccc2bef320e293b89aae7079', }) self.assertEqual(f3.content, 'barbaz')
def test_store_file(self): f = File() f.content = b'foo\n' f.node = f.sha1 chunk = f.to_chunk(self.RevChunk) GitHgHelper.store(b'file', chunk) self.assertEqual( GitHgHelper.hg2git(chunk.node), git_hash(b'blob', f.content)) self.assertEqual(GitHgHelper.file_meta(chunk.node), None) f2 = File() f2.parent1 = f.node f2.content = f.content + b'bar\n' f2.node = f2.sha1 chunk = f2.to_chunk(self.RevChunk, f) GitHgHelper.store(b'file', chunk) self.assertEqual( GitHgHelper.hg2git(chunk.node), git_hash(b'blob', f2.content)) self.assertEqual(GitHgHelper.file_meta(chunk.node), None) f3 = File() f3.parent1 = f.node f3.content = f.content + b'baz\n' f3.node = f3.sha1 if self.RevChunk == RawRevChunk01: delta_node = f2 else: delta_node = f chunk = f3.to_chunk(self.RevChunk, delta_node) GitHgHelper.store(b'file', chunk) self.assertEqual( GitHgHelper.hg2git(chunk.node), git_hash(b'blob', f3.content)) self.assertEqual(GitHgHelper.file_meta(chunk.node), None) f4 = File() f4.parents = (f2.node, f3.node) f4.content = f2.content + b'baz\n' f4.node = f4.sha1 if self.RevChunk == RawRevChunk01: delta_node = f3 else: delta_node = f2 chunk = f4.to_chunk(self.RevChunk, delta_node) GitHgHelper.store(b'file', chunk) self.assertEqual( GitHgHelper.hg2git(chunk.node), git_hash(b'blob', f4.content)) self.assertEqual(GitHgHelper.file_meta(chunk.node), None) f5 = File() f5.content = f4.content f5.metadata = { b'copy': b'foo', b'copyrev': f4.node, } f5.node = f5.sha1 chunk = f5.to_chunk(self.RevChunk) GitHgHelper.store(b'file', chunk) self.assertEqual( GitHgHelper.hg2git(chunk.node), git_hash(b'blob', f5.content)) self.assertEqual( GitHgHelper.file_meta(chunk.node), b'copy: foo\ncopyrev: %s\n' % f4.node) f6 = File() f6.parent1 = f5.node f6.content = f5.content + b'qux\n' f6.node = f6.sha1 chunk = f6.to_chunk(self.RevChunk, f5) GitHgHelper.store(b'file', chunk) self.assertEqual( GitHgHelper.hg2git(chunk.node), git_hash(b'blob', f6.content)) self.assertEqual(GitHgHelper.file_meta(chunk.node), None)
def test_store_changeset(self): files = {} f = File() f.content = b'foo\n' f.node = f.sha1 chunk = f.to_chunk(self.RevChunk) GitHgHelper.store(b'file', chunk) files[f.node] = GitHgHelper.hg2git(chunk.node) f2 = File() f2.content = b'bar\n' f2.node = f2.sha1 chunk = f2.to_chunk(self.RevChunk) GitHgHelper.store(b'file', chunk) files[f2.node] = GitHgHelper.hg2git(chunk.node) m = Manifest() m.add(b'bar', f.node) m.add(b'foo/.bar', f.node) m.add(b'foo/.foo', f.node) m.add(b'foo/bar/baz', f.node) m.add(b'foo/bar/foo', f.node) m.add(b'foo/bar/qux', f.node) m.add(b'foo/foo', f.node) m.add(b'foo/hoge', f.node) m.add(b'foo/qux', f.node) m.add(b'qux', f.node) m.node = m.sha1 chunk = m.to_chunk(self.RevChunk) GitHgHelper.store(b'manifest', chunk) store = GitHgStore() c = Changeset() c.manifest = m.node c.author = b'Cinnabar test <cinnabar@test>' c.timestamp = b'0' c.utcoffset = b'0' c.files = [i.path for i in m] c.body = b'Test commit' c.node = c.sha1 store.store_changeset(c) c_gen = store.changeset(c.node) self.assertEqual(c.raw_data, c_gen.raw_data) commit = GitCommit(GitHgHelper.hg2git(c.node)) self.assertEqual(commit.body, c.body) ct = self.commit_tree(m, files) self.assertEqual(commit.tree, ct) # Weird case as seen in the GNU octave repo. # The bar subdirectory is supposed to be transposed to the same # content as the git tree for the manifest above. m2 = Manifest() m2.add(b'bar/bar', f.node) m2.add(b'bar/foo/.foo', f.node) m2.add(b'bar/foo//.bar', f.node) m2.add(b'bar/foo//.foo', f2.node) m2.add(b'bar/foo//bar/baz', f2.node) m2.add(b'bar/foo//bar/foo', f.node) m2.add(b'bar/foo//hoge', f.node) m2.add(b'bar/foo/bar/baz', f.node) m2.add(b'bar/foo/bar/qux', f.node) m2.add(b'bar/foo/foo', f.node) m2.add(b'bar/foo/qux', f.node) m2.add(b'bar/qux', f.node) m2.node = m2.sha1 chunk = m2.to_chunk(self.RevChunk, m) GitHgHelper.store(b'manifest', chunk) c2 = Changeset() c2.parent1 = c.node c2.manifest = m2.node c2.author = b'Cinnabar test <cinnabar@test>' c2.timestamp = b'0' c2.utcoffset = b'0' c2.files = [i.path for i in m2] c2.body = b'Test commit' c2.node = c2.sha1 store.store_changeset(c2) c2_gen = store.changeset(c2.node) self.assertEqual(c2.raw_data, c2_gen.raw_data) commit = GitCommit(GitHgHelper.hg2git(c2.node)) self.assertEqual(commit.body, c2.body) self.assertEqual(ct, one(Git.ls_tree(commit.tree, b'bar'))[2]) # Corner case: empty manifest m3 = Manifest() m3.node = m3.sha1 self.assertEqual(b'b80de5d138758541c5f05265ad144ab9fa86d1db', m3.node) chunk = m3.to_chunk(self.RevChunk, m2) GitHgHelper.store(b'manifest', chunk) commit = GitCommit(GitHgHelper.hg2git(m3.node)) self.assertEqual(EMPTY_TREE, commit.tree) c3 = Changeset() c3.parent1 = c2.node c3.manifest = m3.node c3.author = b'Cinnabar test <cinnabar@test>' c3.timestamp = b'0' c3.utcoffset = b'0' c3.body = b'Test commit' c3.node = c3.sha1 store.store_changeset(c3) c3_gen = store.changeset(c3.node) self.assertEqual(c3.raw_data, c3_gen.raw_data) commit = GitCommit(GitHgHelper.hg2git(c3.node)) self.assertEqual(commit.body, c3.body) self.assertEqual(EMPTY_TREE, commit.tree) # Corner case: null manifest c4 = Changeset() c4.parent1 = c3.node c4.manifest = NULL_NODE_ID c4.author = b'Cinnabar test <cinnabar@test>' c4.timestamp = b'0' c4.utcoffset = b'0' c4.body = b'Test commit' c4.node = c4.sha1 store.store_changeset(c4) c4_gen = store.changeset(c4.node) self.assertEqual(c4.raw_data, c4_gen.raw_data) commit = GitCommit(GitHgHelper.hg2git(c4.node)) self.assertEqual(commit.body, c4.body) self.assertEqual(EMPTY_TREE, commit.tree) # Corner case: identical changeset with a difference that wouldn't # appear in the git commit without adjustment (which is: cinnabar adds # a nul character to the commit message.. chunk = c2.to_chunk(RawRevChunk02) c5 = Changeset.from_chunk(chunk) c5.branch = b'branched' c5.node = c5.sha1 store.store_changeset(c5) c5_gen = store.changeset(c5.node) self.assertEqual(c5.raw_data, c5_gen.raw_data) commit = GitCommit(GitHgHelper.hg2git(c5.node)) self.assertEqual(commit.body, c5.body + b'\0') self.assertEqual(ct, one(Git.ls_tree(commit.tree, b'bar'))[2])
def test_store_changeset(self): files = {} f = File() f.content = b'foo\n' f.node = f.sha1 chunk = f.to_chunk(self.RevChunk) GitHgHelper.store(b'file', chunk) files[f.node] = GitHgHelper.hg2git(chunk.node) f2 = File() f2.content = b'bar\n' f2.node = f2.sha1 chunk = f2.to_chunk(self.RevChunk) GitHgHelper.store(b'file', chunk) files[f2.node] = GitHgHelper.hg2git(chunk.node) m = Manifest() m.add(b'bar', f.node) m.add(b'foo/.bar', f.node) m.add(b'foo/.foo', f.node) m.add(b'foo/bar/baz', f.node) m.add(b'foo/bar/foo', f.node) m.add(b'foo/bar/qux', f.node) m.add(b'foo/foo', f.node) m.add(b'foo/hoge', f.node) m.add(b'foo/qux', f.node) m.add(b'qux', f.node) m.node = m.sha1 chunk = m.to_chunk(self.RevChunk) GitHgHelper.store(b'manifest', chunk) store = GitHgStore() c = Changeset() c.manifest = m.node c.author = b'Cinnabar test <cinnabar@test>' c.timestamp = b'0' c.utcoffset = b'0000' c.files = [i.path for i in m] c.body = b'Test commit' c.node = c.sha1 store.store_changeset(c) c_gen = store.changeset(c.node) self.assertEqual(c.raw_data, c_gen.raw_data) commit = GitCommit(GitHgHelper.hg2git(c.node)) self.assertEqual(commit.body, c.body) ct = self.commit_tree(m, files) self.assertEqual(commit.tree, ct) # Weird case as seen in the GNU octave repo. # The bar subdirectory is supposed to be transposed to the same # content as the git tree for the manifest above. m2 = Manifest() m2.add(b'bar/bar', f.node) m2.add(b'bar/foo/.foo', f.node) m2.add(b'bar/foo//.bar', f.node) m2.add(b'bar/foo//.foo', f2.node) m2.add(b'bar/foo//bar/baz', f2.node) m2.add(b'bar/foo//bar/foo', f.node) m2.add(b'bar/foo//hoge', f.node) m2.add(b'bar/foo/bar/baz', f.node) m2.add(b'bar/foo/bar/qux', f.node) m2.add(b'bar/foo/foo', f.node) m2.add(b'bar/foo/qux', f.node) m2.add(b'bar/qux', f.node) m2.node = m2.sha1 chunk = m2.to_chunk(self.RevChunk, m) GitHgHelper.store(b'manifest', chunk) c2 = Changeset() c2.parent1 = c.node c2.manifest = m2.node c2.author = b'Cinnabar test <cinnabar@test>' c2.timestamp = b'0' c2.utcoffset = b'0000' c2.files = [i.path for i in m2] c2.body = b'Test commit' c2.node = c2.sha1 store.store_changeset(c2) c2_gen = store.changeset(c2.node) self.assertEqual(c2.raw_data, c2_gen.raw_data) commit = GitCommit(GitHgHelper.hg2git(c2.node)) self.assertEqual(commit.body, c2.body) self.assertEqual(ct, one(Git.ls_tree(commit.tree, b'bar'))[2])