Пример #1
0
    def setUp(self):
        super(TestThinPack, self).setUp()
        self.store = MemoryObjectStore()
        self.blobs = {}
        for blob in ('foo', 'bar', 'foo1234', 'bar2468'):
            self.blobs[blob] = make_object(Blob, data=blob)
        self.store.add_object(self.blobs['foo'])
        self.store.add_object(self.blobs['bar'])

        # Build a thin pack. 'foo' is as an external reference, 'bar' an
        # internal reference.
        self.pack_dir = tempfile.mkdtemp()
        self.addCleanup(shutil.rmtree, self.pack_dir)
        self.pack_prefix = os.path.join(self.pack_dir, 'pack')

        f = open(self.pack_prefix + '.pack', 'wb')
        try:
            build_pack(f, [
                (REF_DELTA, (self.blobs['foo'].id, 'foo1234')),
                (Blob.type_num, 'bar'),
                (REF_DELTA, (self.blobs['bar'].id, 'bar2468'))],
                store=self.store)
        finally:
            f.close()

        # Index the new pack.
        pack = self.make_pack(True)
        data = PackData(pack._data_path)
        data.pack = pack
        data.create_index(self.pack_prefix + '.idx')

        del self.store[self.blobs['bar'].id]
Пример #2
0
 def test_read_objects_buffered(self):
     f = StringIO()
     build_pack(f, [
       (Blob.type_num, 'blob'),
       (OFS_DELTA, (0, 'blob1')),
       ])
     reader = PackStreamReader(f.read, zlib_bufsize=4)
     self.assertEqual(2, len(list(reader.read_objects())))
Пример #3
0
    def test_read_objects(self):
        f = StringIO()
        entries = build_pack(f, [
          (Blob.type_num, 'blob'),
          (OFS_DELTA, (0, 'blob1')),
          ])
        reader = PackStreamReader(f.read)
        objects = list(reader.read_objects(compute_crc32=True))
        self.assertEqual(2, len(objects))

        unpacked_blob, unpacked_delta = objects

        self.assertEqual(entries[0][0], unpacked_blob.offset)
        self.assertEqual(Blob.type_num, unpacked_blob.pack_type_num)
        self.assertEqual(Blob.type_num, unpacked_blob.obj_type_num)
        self.assertEqual(None, unpacked_blob.delta_base)
        self.assertEqual('blob', ''.join(unpacked_blob.decomp_chunks))
        self.assertEqual(entries[0][4], unpacked_blob.crc32)

        self.assertEqual(entries[1][0], unpacked_delta.offset)
        self.assertEqual(OFS_DELTA, unpacked_delta.pack_type_num)
        self.assertEqual(None, unpacked_delta.obj_type_num)
        self.assertEqual(unpacked_delta.offset - unpacked_blob.offset,
                         unpacked_delta.delta_base)
        delta = create_delta('blob', 'blob1')
        self.assertEqual(delta, ''.join(unpacked_delta.decomp_chunks))
        self.assertEqual(entries[1][4], unpacked_delta.crc32)
Пример #4
0
 def test_ref_deltas_chain(self):
     f = StringIO()
     entries = build_pack(f, [
       (REF_DELTA, (2, 'blob1')),
       (Blob.type_num, ('blob')),
       (REF_DELTA, (1, 'blob2')),
       ])
     self.assertEntriesMatch([1, 2, 0], entries, self.make_pack_iter(f))
Пример #5
0
 def test_no_deltas(self):
     f = StringIO()
     entries = build_pack(f, [
       (Commit.type_num, 'commit'),
       (Blob.type_num, 'blob'),
       (Tree.type_num, 'tree'),
       ])
     self.assertEntriesMatch([0, 1, 2], entries, self.make_pack_iter(f))
Пример #6
0
 def test_branchy_chain(self):
     n = 100
     objects_spec = [(Blob.type_num, 'blob')]
     for i in xrange(n):
         objects_spec.append((OFS_DELTA, (0, 'blob%i' % i)))
     f = StringIO()
     entries = build_pack(f, objects_spec)
     self.assertEntriesMatch(xrange(n + 1), entries, self.make_pack_iter(f))
Пример #7
0
 def test_ext_ref(self):
     blob, = self.store_blobs(['blob'])
     f = StringIO()
     entries = build_pack(f, [(REF_DELTA, (blob.id, 'blob1'))],
                          store=self.store)
     pack_iter = self.make_pack_iter(f)
     self.assertEntriesMatch([0], entries, pack_iter)
     self.assertEqual([hex_to_sha(blob.id)], pack_iter.ext_refs())
Пример #8
0
 def test_ofs_deltas_chain(self):
     f = StringIO()
     entries = build_pack(f, [
       (Blob.type_num, 'blob'),
       (OFS_DELTA, (0, 'blob1')),
       (OFS_DELTA, (1, 'blob2')),
       ])
     self.assertEntriesMatch([0, 1, 2], entries, self.make_pack_iter(f))
Пример #9
0
 def test_ofs_and_ref_deltas(self):
     # Deltas pending on this offset are popped before deltas depending on
     # this ref.
     f = StringIO()
     entries = build_pack(f, [
       (REF_DELTA, (1, 'blob1')),
       (Blob.type_num, ('blob')),
       (OFS_DELTA, (1, 'blob2')),
       ])
     self.assertEntriesMatch([1, 2, 0], entries, self.make_pack_iter(f))
Пример #10
0
 def test_multiple_ext_refs(self):
     b1, b2 = self.store_blobs(['foo', 'bar'])
     f = StringIO()
     entries = build_pack(f, [
       (REF_DELTA, (b1.id, 'foo1')),
       (REF_DELTA, (b2.id, 'bar2')),
       ], store=self.store)
     pack_iter = self.make_pack_iter(f)
     self.assertEntriesMatch([0, 1], entries, pack_iter)
     self.assertEqual([hex_to_sha(b1.id), hex_to_sha(b2.id)],
                      pack_iter.ext_refs())
Пример #11
0
 def test_mixed_chain(self):
     f = StringIO()
     entries = build_pack(f, [
         (Blob.type_num, 'blob'),
         (REF_DELTA, (2, 'blob2')),
         (OFS_DELTA, (0, 'blob1')),
         (OFS_DELTA, (1, 'blob3')),
         (OFS_DELTA, (0, 'bob')),
     ])
     self.assertEntriesMatch([0, 2, 1, 3, 4], entries,
                             self.make_pack_iter(f))
Пример #12
0
 def test_bad_ext_ref_non_thin_pack(self):
     blob, = self.store_blobs(['blob'])
     f = StringIO()
     entries = build_pack(f, [(REF_DELTA, (blob.id, 'blob1'))],
                          store=self.store)
     pack_iter = self.make_pack_iter(f, thin=False)
     try:
         list(pack_iter._walk_all_chains())
         self.fail()
     except KeyError, e:
         self.assertEqual(([blob.id],), e.args)
Пример #13
0
 def test_mixed_chain(self):
     f = StringIO()
     entries = build_pack(f, [
       (Blob.type_num, 'blob'),
       (REF_DELTA, (2, 'blob2')),
       (OFS_DELTA, (0, 'blob1')),
       (OFS_DELTA, (1, 'blob3')),
       (OFS_DELTA, (0, 'bob')),
       ])
     self.assertEntriesMatch([0, 2, 1, 3, 4], entries,
                             self.make_pack_iter(f))
Пример #14
0
 def test_ext_ref_multiple_times(self):
     blob, = self.store_blobs(['blob'])
     f = StringIO()
     entries = build_pack(f, [
         (REF_DELTA, (blob.id, 'blob1')),
         (REF_DELTA, (blob.id, 'blob2')),
     ],
                          store=self.store)
     pack_iter = self.make_pack_iter(f)
     self.assertEntriesMatch([0, 1], entries, pack_iter)
     self.assertEqual([hex_to_sha(blob.id)], pack_iter.ext_refs())
Пример #15
0
 def test_bad_ext_ref_non_thin_pack(self):
     blob, = self.store_blobs(['blob'])
     f = StringIO()
     entries = build_pack(f, [(REF_DELTA, (blob.id, 'blob1'))],
                          store=self.store)
     pack_iter = self.make_pack_iter(f, thin=False)
     try:
         list(pack_iter._walk_all_chains())
         self.fail()
     except KeyError, e:
         self.assertEqual(([blob.id],), e.args)
Пример #16
0
 def test_multiple_ext_refs(self):
     b1, b2 = self.store_blobs(['foo', 'bar'])
     f = StringIO()
     entries = build_pack(f, [
       (REF_DELTA, (b1.id, 'foo1')),
       (REF_DELTA, (b2.id, 'bar2')),
       ], store=self.store)
     pack_iter = self.make_pack_iter(f)
     self.assertEntriesMatch([0, 1], entries, pack_iter)
     self.assertEqual([hex_to_sha(b1.id), hex_to_sha(b2.id)],
                      pack_iter.ext_refs())
Пример #17
0
 def test_bad_ext_ref_thin_pack(self):
     b1, b2, b3 = self.store_blobs(['foo', 'bar', 'baz'])
     f = StringIO()
     entries = build_pack(f, [
       (REF_DELTA, (1, 'foo99')),
       (REF_DELTA, (b1.id, 'foo1')),
       (REF_DELTA, (b2.id, 'bar2')),
       (REF_DELTA, (b3.id, 'baz3')),
       ], store=self.store)
     del self.store[b2.id]
     del self.store[b3.id]
     pack_iter = self.make_pack_iter(f)
     try:
         list(pack_iter._walk_all_chains())
         self.fail()
     except KeyError, e:
         self.assertEqual((sorted([b2.id, b3.id]),), e.args)
Пример #18
0
 def test_bad_ext_ref_thin_pack(self):
     b1, b2, b3 = self.store_blobs(['foo', 'bar', 'baz'])
     f = StringIO()
     entries = build_pack(f, [
       (REF_DELTA, (1, 'foo99')),
       (REF_DELTA, (b1.id, 'foo1')),
       (REF_DELTA, (b2.id, 'bar2')),
       (REF_DELTA, (b3.id, 'baz3')),
       ], store=self.store)
     del self.store[b2.id]
     del self.store[b3.id]
     pack_iter = self.make_pack_iter(f)
     try:
         list(pack_iter._walk_all_chains())
         self.fail()
     except KeyError, e:
         self.assertEqual((sorted([b2.id, b3.id]),), e.args)
Пример #19
0
 def test_read_objects_emtpy(self):
     f = StringIO()
     build_pack(f, [])
     reader = PackStreamReader(f.read)
     self.assertEqual(0, len(list(reader.read_objects())))
Пример #20
0
 def test_read_objects_emtpy(self):
     f = StringIO()
     build_pack(f, [])
     reader = PackStreamReader(f.read)
     self.assertEqual(0, len(list(reader.read_objects())))