def test_commit_without_manifest(self):
     """Tests a Release can still be produced when the manifest is not understood
     by the custom parser in dulwich_commit_to_revision."""
     target = b"641fb6e08ddb2e4fd096dcf18e80b894bf7e25ce"
     message = b"some commit message"
     author = Person(fullname=b"Foo <*****@*****.**>",
                     name=b"Foo",
                     email=b"*****@*****.**")
     commit = dulwich.objects.Commit()
     commit.tree = target
     commit.message = message
     commit.author = commit.committer = b"Foo <*****@*****.**>"
     commit.author_time = commit.commit_time = 1641980946
     commit.author_timezone = commit.commit_timezone = 3600
     assert converters.dulwich_commit_to_revision(commit) == Revision(
         message=b"some commit message",
         author=author,
         committer=author,
         date=TimestampWithTimezone(
             timestamp=Timestamp(seconds=1641980946, microseconds=0),
             offset_bytes=b"+0100",
         ),
         committer_date=TimestampWithTimezone(
             timestamp=Timestamp(seconds=1641980946, microseconds=0),
             offset_bytes=b"+0100",
         ),
         type=RevisionType.GIT,
         directory=hash_to_bytes(target.decode()),
         synthetic=False,
         metadata=None,
         parents=(),
     )
def test_svn_date_to_swh_date():
    """The timestamp should not be tampered with and include the
    decimals.

    """
    assert converters.svn_date_to_swh_date(
        b"2011-05-31T06:04:39.500900Z") == TimestampWithTimezone(
            timestamp=Timestamp(seconds=1306821879, microseconds=500900),
            offset_bytes=b"+0000",
        )

    assert converters.svn_date_to_swh_date(
        b"2011-05-31T06:04:39.800722Z") == TimestampWithTimezone(
            timestamp=Timestamp(seconds=1306821879, microseconds=800722),
            offset_bytes=b"+0000",
        )
예제 #3
0
def db_to_date(
    date: Optional[datetime.datetime],
    offset_bytes: bytes,
) -> Optional[TimestampWithTimezone]:
    """Convert the DB representation of a date to a swh-model compatible date.

    Args:
        date: a date pulled out of the database
        offset_bytes: a byte representation of the latter two, usually as "+HHMM"
          or "-HHMM"

    Returns:
        a TimestampWithTimezone, or None if the date is None.

    """

    if date is None:
        return None

    return TimestampWithTimezone(
        timestamp=Timestamp(
            # we use floor() instead of int() to round down, because of negative dates
            seconds=math.floor(date.timestamp()),
            microseconds=date.microsecond,
        ),
        offset_bytes=offset_bytes,
    )
    def test_commit_to_revision_with_extra_headers_mergetag(self):
        sha1 = b"3ab3da4bf0f81407be16969df09cd1c8af9ac703"

        revision = converters.dulwich_commit_to_revision(self.repo[sha1])
        expected_revision = Revision(
            id=hash_to_bytes(sha1.decode()),
            directory=bytes.fromhex(
                "faa4b64a841ca3e3f07d6501caebda2e3e8e544e"),
            type=RevisionType.GIT,
            committer=Person(
                name=b"David Douard",
                fullname=b"David Douard <*****@*****.**>",
                email=b"*****@*****.**",
            ),
            author=Person(
                name=b"David Douard",
                fullname=b"David Douard <*****@*****.**>",
                email=b"*****@*****.**",
            ),
            committer_date=TimestampWithTimezone(
                timestamp=Timestamp(
                    seconds=1594138183,
                    microseconds=0,
                ),
                offset_bytes=b"+0200",
            ),
            message=b"Merge tag 'v0.0.1' into readme\n\nv0.0.1\n",
            metadata=None,
            extra_headers=((b"encoding", b"ISO-8859-15"), (b"mergetag",
                                                           MERGETAG)),
            date=TimestampWithTimezone(
                timestamp=Timestamp(
                    seconds=1594138183,
                    microseconds=0,
                ),
                offset_bytes=b"+0200",
            ),
            parents=(
                bytes.fromhex("322f5bc915e50fc25e85226b5a182bded0e98e4b"),
                bytes.fromhex("9768d0b576dbaaecd80abedad6dfd0d72f1476da"),
            ),
            synthetic=False,
        )

        assert revision == expected_revision
def test_svn_date_to_swh_date_epoch():
    """Empty date should be EPOCH (timestamp and offset at 0)."""
    # It should return 0, epoch
    default_tstz = TimestampWithTimezone(timestamp=Timestamp(seconds=0,
                                                             microseconds=0),
                                         offset_bytes=b"+0000")

    assert converters.svn_date_to_swh_date("") == default_tstz
    assert converters.svn_date_to_swh_date(None) == default_tstz
def test_build_swh_revision_default():
    """This should build the swh revision with the swh revision's extra
    headers about the repository.

    """
    dir_id = hash_to_bytes("d6e08e19159f77983242877c373c75222d5ae9dd")
    date = TimestampWithTimezone(timestamp=Timestamp(seconds=1088108379,
                                                     microseconds=0),
                                 offset_bytes=b"+0000")
    actual_rev = converters.build_swh_revision(
        repo_uuid=b"uuid",
        dir_id=dir_id,
        commit={
            "author_name":
            Person(name=b"theo",
                   email=b"theo@uuid",
                   fullname=b"theo <theo@uuid>"),
            "message":
            b"commit message",
            "author_date":
            date,
        },
        rev=10,
        parents=(),
    )

    expected_rev = Revision.from_dict({
        "date":
        date.to_dict(),
        "committer_date":
        date.to_dict(),
        "type":
        "svn",
        "directory":
        dir_id,
        "message":
        b"commit message",
        "author": {
            "name": b"theo",
            "email": b"theo@uuid",
            "fullname": b"theo <theo@uuid>",
        },
        "committer": {
            "name": b"theo",
            "email": b"theo@uuid",
            "fullname": b"theo <theo@uuid>",
        },
        "synthetic":
        True,
        "extra_headers": (
            (b"svn_repo_uuid", b"uuid"),
            (b"svn_revision", b"10"),
        ),
        "parents": (),
    })

    assert actual_rev == expected_rev
    def test_commit_to_revision_with_extra_headers(self):
        sha1 = b"322f5bc915e50fc25e85226b5a182bded0e98e4b"

        revision = converters.dulwich_commit_to_revision(self.repo[sha1])
        expected_revision = Revision(
            id=hash_to_bytes(sha1.decode()),
            directory=bytes.fromhex(
                "f8ec06e4ed7b9fff4918a0241a48023143f30000"),
            type=RevisionType.GIT,
            committer=Person(
                name=b"David Douard",
                fullname=b"David Douard <*****@*****.**>",
                email=b"*****@*****.**",
            ),
            author=Person(
                name=b"David Douard",
                fullname=b"David Douard <*****@*****.**>",
                email=b"*****@*****.**",
            ),
            committer_date=TimestampWithTimezone(
                timestamp=Timestamp(
                    seconds=1594137902,
                    microseconds=0,
                ),
                offset_bytes=b"+0200",
            ),
            message=b"Am\xe9lioration du fichier READM\xa4\n",
            metadata=None,
            extra_headers=((b"encoding", b"ISO-8859-15"), (b"gpgsig", GPGSIG)),
            date=TimestampWithTimezone(
                timestamp=Timestamp(
                    seconds=1594136900,
                    microseconds=0,
                ),
                offset_bytes=b"+0200",
            ),
            parents=(
                bytes.fromhex("c730509025c6e81947102b2d77bc4dc1cade9489"), ),
            synthetic=False,
        )

        assert revision == expected_revision
    def test_commit_to_revision(self):
        sha1 = b"9768d0b576dbaaecd80abedad6dfd0d72f1476da"

        revision = converters.dulwich_commit_to_revision(self.repo[sha1])
        expected_revision = Revision(
            id=hash_to_bytes("9768d0b576dbaaecd80abedad6dfd0d72f1476da"),
            directory=b"\xf0i\\./\xa7\xce\x9dW@#\xc3A7a\xa4s\xe5\x00\xca",
            type=RevisionType.GIT,
            committer=Person(
                name=b"Stefano Zacchiroli",
                fullname=b"Stefano Zacchiroli <*****@*****.**>",
                email=b"*****@*****.**",
            ),
            author=Person(
                name=b"Stefano Zacchiroli",
                fullname=b"Stefano Zacchiroli <*****@*****.**>",
                email=b"*****@*****.**",
            ),
            committer_date=TimestampWithTimezone(
                timestamp=Timestamp(
                    seconds=1443083765,
                    microseconds=0,
                ),
                offset_bytes=b"+0200",
            ),
            message=b"add submodule dependency\n",
            metadata=None,
            extra_headers=(),
            date=TimestampWithTimezone(
                timestamp=Timestamp(
                    seconds=1443083765,
                    microseconds=0,
                ),
                offset_bytes=b"+0200",
            ),
            parents=(
                b"\xc3\xc5\x88q23`\x9f[\xbb\xb2\xd9\xe7\xf3\xfbJf\x0f?r", ),
            synthetic=False,
        )

        assert revision == expected_revision
    def test_dulwich_tag_to_release_author_and_date(self):
        sha = hash_to_bytes("fc1e6a4f1e37e93e28e78560e73efd0b12f616ef")
        tagger = b"hey dude <*****@*****.**>"
        target = b"641fb6e08ddb2e4fd096dcf18e80b894bf7e25ce"
        message = b"some release message"

        date = int(
            datetime.datetime(2007, 12, 5,
                              tzinfo=datetime.timezone.utc).timestamp())

        tag = dulwich.objects.Tag()
        tag.name = b"blah"
        tag.object = (dulwich.objects.Commit, target)
        tag.message = message
        tag.signature = None
        tag.tagger = tagger
        tag.tag_time = date
        tag.tag_timezone = 0
        assert tag.sha().digest() == sha

        # when
        actual_release = converters.dulwich_tag_to_release(tag)

        # then
        expected_release = Release(
            author=Person(
                email=b"*****@*****.**",
                fullname=b"hey dude <*****@*****.**>",
                name=b"hey dude",
            ),
            date=TimestampWithTimezone(
                timestamp=Timestamp(
                    seconds=1196812800,
                    microseconds=0,
                ),
                offset_bytes=b"+0000",
            ),
            id=sha,
            message=message,
            metadata=None,
            name=b"blah",
            synthetic=False,
            target=hash_to_bytes(target.decode()),
            target_type=ObjectType.REVISION,
        )

        assert actual_release == expected_release
    def test_dulwich_tag_to_release_author_zero_date(self):
        # to reproduce bug T815 (fixed)
        sha = hash_to_bytes("6cc1deff5cdcd853428bb63b937f43dd2566c36f")
        tagger = b"hey dude <*****@*****.**>"
        target = b"641fb6e08ddb2e4fd096dcf18e80b894bf7e25ce"
        message = b"some release message"
        date = int(
            datetime.datetime(1970, 1, 1,
                              tzinfo=datetime.timezone.utc).timestamp())
        tag = dulwich.objects.Tag()
        tag.name = b"blah"
        tag.object = (dulwich.objects.Commit, target)
        tag.message = message
        tag.signature = None
        tag.tagger = tagger
        tag.tag_time = date
        tag.tag_timezone = 0
        assert tag.sha().digest() == sha

        # when
        actual_release = converters.dulwich_tag_to_release(tag)

        # then
        expected_release = Release(
            author=Person(
                email=b"*****@*****.**",
                fullname=b"hey dude <*****@*****.**>",
                name=b"hey dude",
            ),
            date=TimestampWithTimezone(
                timestamp=Timestamp(
                    seconds=0,
                    microseconds=0,
                ),
                offset_bytes=b"+0000",
            ),
            id=sha,
            message=message,
            metadata=None,
            name=b"blah",
            synthetic=False,
            target=hash_to_bytes(target.decode()),
            target_type=ObjectType.REVISION,
        )

        assert actual_release == expected_release
예제 #11
0
def test_from_release():
    """Convert release model object to a dict should be ok"""
    ts = int(
        datetime.datetime(2015, 1, 1, 22, 0, 0,
                          tzinfo=datetime.timezone.utc).timestamp())
    release_input = Release(
        id=hashutil.hash_to_bytes("aad23fa492a0c5fed0708a6703be875448c86884"),
        target=hashutil.hash_to_bytes(
            "5e46d564378afc44b31bb89f99d5675195fbdf67"),
        target_type=ObjectType.REVISION,
        date=TimestampWithTimezone(
            timestamp=Timestamp(seconds=ts, microseconds=0),
            offset=0,
            negative_utc=False,
        ),
        author=Person(
            name=b"author name",
            fullname=b"Author Name author@email",
            email=b"author@email",
        ),
        name=b"v0.0.1",
        message=b"some comment on release",
        synthetic=True,
    )

    expected_release = {
        "id": "aad23fa492a0c5fed0708a6703be875448c86884",
        "target": "5e46d564378afc44b31bb89f99d5675195fbdf67",
        "target_type": "revision",
        "date": "2015-01-01T22:00:00+00:00",
        "author": {
            "name": "author name",
            "fullname": "Author Name author@email",
            "email": "author@email",
        },
        "name": "v0.0.1",
        "message": "some comment on release",
        "target_type": "revision",
        "synthetic": True,
    }

    actual_release = converters.from_release(release_input)

    assert actual_release == expected_release
예제 #12
0
def dulwich_tsinfo_to_timestamp(
    timestamp,
    timezone: int,
    timezone_neg_utc: bool,
    timezone_bytes: Optional[bytes],
) -> TimestampWithTimezone:
    """Convert the dulwich timestamp information to a structure compatible with
    Software Heritage."""
    ts = Timestamp(
        seconds=int(timestamp),
        microseconds=0,
    )
    if timezone_bytes is None:
        # Failed to parse from the raw manifest, fallback to what Dulwich managed to
        # parse.
        return TimestampWithTimezone.from_numeric_offset(
            timestamp=ts,
            offset=timezone // 60,
            negative_utc=timezone_neg_utc,
        )
    else:
        return TimestampWithTimezone(timestamp=ts, offset_bytes=timezone_bytes)
    def test_weird_commit(self):
        """Checks raw_manifest is set when the commit cannot fit the data model"""

        # Well-formed manifest
        raw_manifest = (b"tree 641fb6e08ddb2e4fd096dcf18e80b894bf7e25ce\n"
                        b"author Foo <*****@*****.**> 1640191028 +0200\n"
                        b"committer Foo <*****@*****.**> 1640191028 +0200\n\n"
                        b"some commit message")
        commit = dulwich.objects.Commit.from_raw_string(
            b"commit", raw_manifest)
        date = TimestampWithTimezone(
            timestamp=Timestamp(seconds=1640191028, microseconds=0),
            offset_bytes=b"+0200",
        )
        assert converters.dulwich_commit_to_revision(commit) == Revision(
            message=b"some commit message",
            directory=hash_to_bytes(
                "641fb6e08ddb2e4fd096dcf18e80b894bf7e25ce"),
            synthetic=False,
            author=Person.from_fullname(b"Foo <*****@*****.**>", ),
            committer=Person.from_fullname(b"Foo <*****@*****.**>", ),
            date=date,
            committer_date=date,
            type=RevisionType.GIT,
            raw_manifest=None,
        )

        # Mess with the offset
        raw_manifest2 = raw_manifest.replace(b"+0200", b"+200")
        commit = dulwich.objects.Commit.from_raw_string(
            b"commit", raw_manifest2)
        date = TimestampWithTimezone(
            timestamp=Timestamp(seconds=1640191028, microseconds=0),
            offset_bytes=b"+200",
        )
        assert converters.dulwich_commit_to_revision(commit) == Revision(
            message=b"some commit message",
            directory=hash_to_bytes(
                "641fb6e08ddb2e4fd096dcf18e80b894bf7e25ce"),
            synthetic=False,
            author=Person.from_fullname(b"Foo <*****@*****.**>", ),
            committer=Person.from_fullname(b"Foo <*****@*****.**>", ),
            date=date,
            committer_date=date,
            type=RevisionType.GIT,
            raw_manifest=None,
        )

        # Mess with the rest of the manifest
        raw_manifest2 = raw_manifest.replace(
            b"641fb6e08ddb2e4fd096dcf18e80b894bf7e25ce",
            b"641FB6E08DDB2E4FD096DCF18E80B894BF7E25CE",
        )
        commit = dulwich.objects.Commit.from_raw_string(
            b"commit", raw_manifest2)
        date = TimestampWithTimezone(
            timestamp=Timestamp(seconds=1640191028, microseconds=0),
            offset_bytes=b"+0200",
        )
        assert converters.dulwich_commit_to_revision(commit) == Revision(
            message=b"some commit message",
            directory=hash_to_bytes(
                "641fb6e08ddb2e4fd096dcf18e80b894bf7e25ce"),
            synthetic=False,
            author=Person.from_fullname(b"Foo <*****@*****.**>", ),
            committer=Person.from_fullname(b"Foo <*****@*****.**>", ),
            date=date,
            committer_date=date,
            type=RevisionType.GIT,
            raw_manifest=b"commit 161\x00" + raw_manifest2,
        )
 "model_date,db_date",
 [
     (
         None,
         {
             "timestamp": None,
             "offset": 0,
             "neg_utc_offset": None,
             "offset_bytes": None,
         },
     ),
     (
         TimestampWithTimezone(
             timestamp=Timestamp(
                 seconds=1234567890,
                 microseconds=0,
             ),
             offset_bytes=b"+0200",
         ),
         {
             "timestamp": "2009-02-13T23:31:30+00:00",
             "offset": 120,
             "neg_utc_offset": False,
             "offset_bytes": b"+0200",
         },
     ),
     (
         TimestampWithTimezone(
             timestamp=Timestamp(
                 seconds=1123456789,
                 microseconds=0,
예제 #15
0
            type="file",
            target=CONTENT.sha1_git,
            perms=DentryPerms.content,
        )
    ]),
)

REVISION = Revision(
    id=hash_to_bytes("066b1b62dbfa033362092af468bf6cfabec230e7"),
    message=b"hello",
    author=Person(
        name=b"Nicolas Dandrimont",
        email=b"*****@*****.**",
        fullname=b"Nicolas Dandrimont <*****@*****.**> ",
    ),
    date=TimestampWithTimezone(Timestamp(1234567890, 0),
                               offset_bytes=b"+0200"),
    committer=Person(
        name=b"St\xc3fano Zacchiroli",
        email=b"*****@*****.**",
        fullname=b"St\xc3fano Zacchiroli <*****@*****.**>",
    ),
    committer_date=TimestampWithTimezone(Timestamp(1123456789, 0),
                                         offset_bytes=b"-0000"),
    parents=(),
    type=RevisionType.GIT,
    directory=DIRECTORY.id,
    metadata={
        "checksums": {
            "sha1": "tarball-sha1",
            "sha256": "tarball-sha256",
        },
예제 #16
0
def test_debian_origins_from_row__check_revisions():
    """Tests debian_origins_from_row errors when the revision at the head
    of a branch is a DSC and has no parents
    """
    storage = get_storage("memory")

    origin_url = "deb://Debian/packages/kalgebra"
    revision_id = b"21" * 10

    storage.origin_add([Origin(url=origin_url)])

    revision_row = {
        "id": b"\x00\x00\x03l1\x1e\xf3:(\x1b\x05h\x8fn\xad\xcf\xc0\x94:\xee",
        "directory": DIRECTORY_ID,
        "metadata": {
            "original_artifact": [
                {
                    "filename": "kalgebra_19.12.1-1.dsc",
                },
            ]
        },
    }

    storage.origin_visit_add([
        OriginVisit(
            origin=origin_url,
            date=datetime.datetime.now(tz=datetime.timezone.utc),
            type="deb",
            visit=280,
        )
    ])

    storage.origin_visit_status_add([
        OriginVisitStatus(
            origin=origin_url,
            visit=280,
            date=datetime.datetime.now(tz=datetime.timezone.utc),
            status="full",
            snapshot=b"42" * 10,
            metadata=None,
        )
    ])
    storage.snapshot_add([
        Snapshot(
            id=b"42" * 10,
            branches={
                b"foo":
                SnapshotBranch(target_type=TargetType.REVISION,
                               target=revision_id)
            },
        )
    ])

    storage_before_revision = copy.deepcopy(storage)

    revision = Revision(
        id=revision_id,
        message=b"foo",
        author=Person.from_fullname(b"foo"),
        committer=Person.from_fullname(b"foo"),
        date=TimestampWithTimezone(
            timestamp=Timestamp(seconds=1580076204, microseconds=0),
            offset_bytes=b"+0100",
        ),
        committer_date=TimestampWithTimezone(
            timestamp=Timestamp(seconds=1580076204, microseconds=0),
            offset_bytes=b"+0100",
        ),
        type=RevisionType.DSC,
        directory=
        b"\xd5\x9a\x1f\x9c\x80\x9d\x8c}19P\xf6\xc8\xa2\x0f^%H\xcd\xdb",
        synthetic=True,
        metadata=None,
        parents=(b"parent    " * 2, ),
        extra_headers=(),
    )
    storage.revision_add([revision])

    with pytest.raises(AssertionError, match="revision with parents"):
        debian_origins_from_row(revision_row, storage)
    def test_weird_tag(self):
        """Checks raw_manifest is set when the tag cannot fit the data model"""

        # Well-formed manifest
        raw_manifest = (b"object 641fb6e08ddb2e4fd096dcf18e80b894bf7e25ce\n"
                        b"type commit\n"
                        b"tag blah\n"
                        b"tagger Foo <*****@*****.**> 1640191027 +0200\n\n"
                        b"some release message")
        tag = dulwich.objects.Tag.from_raw_string(b"tag", raw_manifest)
        assert converters.dulwich_tag_to_release(tag) == Release(
            name=b"blah",
            message=b"some release message",
            target=hash_to_bytes("641fb6e08ddb2e4fd096dcf18e80b894bf7e25ce"),
            target_type=ObjectType.REVISION,
            synthetic=False,
            author=Person.from_fullname(b"Foo <*****@*****.**>", ),
            date=TimestampWithTimezone(
                timestamp=Timestamp(seconds=1640191027, microseconds=0),
                offset_bytes=b"+0200",
            ),
            raw_manifest=None,
        )

        # Mess with the offset (negative UTC)
        raw_manifest2 = raw_manifest.replace(b"+0200", b"-0000")
        tag = dulwich.objects.Tag.from_raw_string(b"tag", raw_manifest2)
        assert converters.dulwich_tag_to_release(tag) == Release(
            name=b"blah",
            message=b"some release message",
            target=hash_to_bytes("641fb6e08ddb2e4fd096dcf18e80b894bf7e25ce"),
            target_type=ObjectType.REVISION,
            synthetic=False,
            author=Person.from_fullname(b"Foo <*****@*****.**>", ),
            date=TimestampWithTimezone(
                timestamp=Timestamp(seconds=1640191027, microseconds=0),
                offset_bytes=b"-0000",
            ),
        )

        # Mess with the offset (other)
        raw_manifest2 = raw_manifest.replace(b"+0200", b"+200")
        tag = dulwich.objects.Tag.from_raw_string(b"tag", raw_manifest2)
        assert converters.dulwich_tag_to_release(tag) == Release(
            name=b"blah",
            message=b"some release message",
            target=hash_to_bytes("641fb6e08ddb2e4fd096dcf18e80b894bf7e25ce"),
            target_type=ObjectType.REVISION,
            synthetic=False,
            author=Person.from_fullname(b"Foo <*****@*****.**>", ),
            date=TimestampWithTimezone(
                timestamp=Timestamp(seconds=1640191027, microseconds=0),
                offset_bytes=b"+200",
            ),
        )

        # Mess with the rest of the manifest
        raw_manifest2 = raw_manifest.replace(
            b"641fb6e08ddb2e4fd096dcf18e80b894bf7e25ce",
            b"641FB6E08DDB2E4FD096DCF18E80B894BF7E25CE",
        )
        tag = dulwich.objects.Tag.from_raw_string(b"tag", raw_manifest2)
        assert converters.dulwich_tag_to_release(tag) == Release(
            name=b"blah",
            message=b"some release message",
            target=hash_to_bytes("641fb6e08ddb2e4fd096dcf18e80b894bf7e25ce"),
            target_type=ObjectType.REVISION,
            synthetic=False,
            author=Person.from_fullname(b"Foo <*****@*****.**>", ),
            date=TimestampWithTimezone(
                timestamp=Timestamp(seconds=1640191027, microseconds=0),
                offset_bytes=b"+0200",
            ),
            raw_manifest=b"tag 136\x00" + raw_manifest2,
        )
예제 #18
0
def test_from_revision_model_object():
    ts = int(
        datetime.datetime(2000,
                          1,
                          17,
                          11,
                          23,
                          54,
                          tzinfo=datetime.timezone.utc).timestamp())
    revision_input = Revision(
        directory=hashutil.hash_to_bytes(
            "7834ef7e7c357ce2af928115c6c6a42b7e2a44e6"),
        author=Person(
            name=b"Software Heritage",
            fullname=b"robot [email protected]",
            email=b"*****@*****.**",
        ),
        committer=Person(
            name=b"Software Heritage",
            fullname=b"robot [email protected]",
            email=b"*****@*****.**",
        ),
        message=b"synthetic revision message",
        date=TimestampWithTimezone(
            timestamp=Timestamp(seconds=ts, microseconds=0),
            offset=0,
            negative_utc=False,
        ),
        committer_date=TimestampWithTimezone(
            timestamp=Timestamp(seconds=ts, microseconds=0),
            offset=0,
            negative_utc=False,
        ),
        synthetic=True,
        type=RevisionType.TAR,
        parents=tuple([
            hashutil.hash_to_bytes("29d8be353ed3480476f032475e7c244eff7371d5"),
            hashutil.hash_to_bytes("30d8be353ed3480476f032475e7c244eff7371d5"),
        ]),
        extra_headers=((b"gpgsig", b"some-signature"), ),
        metadata={
            "original_artifact": [{
                "archive_type":
                "tar",
                "name":
                "webbase-5.7.0.tar.gz",
                "sha1":
                "147f73f369733d088b7a6fa9c4e0273dcd3c7ccd",
                "sha1_git":
                "6a15ea8b881069adedf11feceec35588f2cfe8f1",
                "sha256":
                "401d0df797110bea805d358b85bcc1ced29549d3d73f"
                "309d36484e7edf7bb912",
            }],
        },
    )

    expected_revision = {
        "id":
        "a001358278a0d811fe7072463f805da601121c2a",
        "directory":
        "7834ef7e7c357ce2af928115c6c6a42b7e2a44e6",
        "author": {
            "name": "Software Heritage",
            "fullname": "robot [email protected]",
            "email": "*****@*****.**",
        },
        "committer": {
            "name": "Software Heritage",
            "fullname": "robot [email protected]",
            "email": "*****@*****.**",
        },
        "message":
        "synthetic revision message",
        "date":
        "2000-01-17T11:23:54+00:00",
        "committer_date":
        "2000-01-17T11:23:54+00:00",
        "parents":
        tuple([
            "29d8be353ed3480476f032475e7c244eff7371d5",
            "30d8be353ed3480476f032475e7c244eff7371d5",
        ]),
        "type":
        "tar",
        "synthetic":
        True,
        "extra_headers": (("gpgsig", "some-signature"), ),
        "metadata": {
            "original_artifact": [{
                "archive_type":
                "tar",
                "name":
                "webbase-5.7.0.tar.gz",
                "sha1":
                "147f73f369733d088b7a6fa9c4e0273dcd3c7ccd",
                "sha1_git":
                "6a15ea8b881069adedf11feceec35588f2cfe8f1",
                "sha256":
                "401d0df797110bea805d358b85bcc1ced29549d3d73f"
                "309d36484e7edf7bb912",
            }],
        },
        "merge":
        True,
    }

    actual_revision = converters.from_revision(revision_input)

    assert actual_revision == expected_revision
예제 #19
0
sha1_array[0] += 1
duplicate_content2 = attr.evolve(duplicate_content1,
                                 sha1_git=bytes(sha1_array))

DUPLICATE_CONTENTS = [duplicate_content1, duplicate_content2]

COMMITTERS = [
    Person(fullname=b"foo", name=b"foo", email=b""),
    Person(fullname=b"bar", name=b"bar", email=b""),
]

DATES = [
    TimestampWithTimezone(
        timestamp=Timestamp(
            seconds=1234567891,
            microseconds=0,
        ),
        offset_bytes=b"+0200",
    ),
    TimestampWithTimezone(
        timestamp=Timestamp(
            seconds=1234567892,
            microseconds=0,
        ),
        offset_bytes=b"+0200",
    ),
]

REVISIONS = [
    Revision(
        id=hash_to_bytes("66c7c1cd9673275037140f2abff7b7b11fc9439c"),
예제 #20
0
class StorageData:
    """Data model objects to use within tests."""

    content = Content(
        data=b"42\n",
        length=3,
        sha1=hash_to_bytes("34973274ccef6ab4dfaaf86599792fa9c3fe4689"),
        sha1_git=hash_to_bytes("d81cc0710eb6cf9efd5b920a8453e1e07157b6cd"),
        sha256=hash_to_bytes(
            "084c799cd551dd1d8d5c5f9a5d593b2e931f5e36122ee5c793c1d08a19839cc0"
        ),
        blake2s256=hash_to_bytes(
            "d5fe1939576527e42cfd76a9455a2432fe7f56669564577dd93c4280e76d661d"
        ),
        status="visible",
    )
    content2 = Content(
        data=b"4242\n",
        length=5,
        sha1=hash_to_bytes("61c2b3a30496d329e21af70dd2d7e097046d07b7"),
        sha1_git=hash_to_bytes("36fade77193cb6d2bd826161a0979d64c28ab4fa"),
        sha256=hash_to_bytes(
            "859f0b154fdb2d630f45e1ecae4a862915435e663248bb8461d914696fc047cd"
        ),
        blake2s256=hash_to_bytes(
            "849c20fad132b7c2d62c15de310adfe87be94a379941bed295e8141c6219810d"
        ),
        status="visible",
    )
    content3 = Content(
        data=b"424242\n",
        length=7,
        sha1=hash_to_bytes("3e21cc4942a4234c9e5edd8a9cacd1670fe59f13"),
        sha1_git=hash_to_bytes("c932c7649c6dfa4b82327d121215116909eb3bea"),
        sha256=hash_to_bytes(
            "92fb72daf8c6818288a35137b72155f507e5de8d892712ab96277aaed8cf8a36"
        ),
        blake2s256=hash_to_bytes(
            "76d0346f44e5a27f6bafdd9c2befd304aff83780f93121d801ab6a1d4769db11"
        ),
        status="visible",
        ctime=datetime.datetime(2019, 12, 1, tzinfo=datetime.timezone.utc),
    )
    contents: Tuple[Content, ...] = (content, content2, content3)

    skipped_content = SkippedContent(
        length=1024 * 1024 * 200,
        sha1_git=hash_to_bytes("33e45d56f88993aae6a0198013efa80716fd8920"),
        sha1=hash_to_bytes("43e45d56f88993aae6a0198013efa80716fd8920"),
        sha256=hash_to_bytes(
            "7bbd052ab054ef222c1c87be60cd191addedd24cc882d1f5f7f7be61dc61bb3a"
        ),
        blake2s256=hash_to_bytes(
            "ade18b1adecb33f891ca36664da676e12c772cc193778aac9a137b8dc5834b9b"
        ),
        reason="Content too long",
        status="absent",
        origin="file:///dev/zero",
    )
    skipped_content2 = SkippedContent(
        length=1024 * 1024 * 300,
        sha1_git=hash_to_bytes("44e45d56f88993aae6a0198013efa80716fd8921"),
        sha1=hash_to_bytes("54e45d56f88993aae6a0198013efa80716fd8920"),
        sha256=hash_to_bytes(
            "8cbd052ab054ef222c1c87be60cd191addedd24cc882d1f5f7f7be61dc61bb3a"
        ),
        blake2s256=hash_to_bytes(
            "9ce18b1adecb33f891ca36664da676e12c772cc193778aac9a137b8dc5834b9b"
        ),
        reason="Content too long",
        status="absent",
    )
    skipped_contents: Tuple[SkippedContent,
                            ...] = (skipped_content, skipped_content2)

    directory5 = Directory(
        id=hash_to_bytes("4b825dc642cb6eb9a060e54bf8d69288fbee4904"),
        entries=(),
    )
    directory = Directory(
        id=hash_to_bytes("5256e856a0a0898966d6ba14feb4388b8b82d302"),
        entries=tuple([
            DirectoryEntry(
                name=b"foo",
                type="file",
                target=content.sha1_git,
                perms=from_disk.DentryPerms.content,
            ),
            DirectoryEntry(
                name=b"bar\xc3",
                type="dir",
                target=directory5.id,
                perms=from_disk.DentryPerms.directory,
            ),
        ], ),
    )
    directory2 = Directory(
        id=hash_to_bytes("8505808532953da7d2581741f01b29c04b1cb9ab"),
        entries=tuple([
            DirectoryEntry(
                name=b"oof",
                type="file",
                target=content2.sha1_git,
                perms=from_disk.DentryPerms.content,
            )
        ], ),
    )
    directory3 = Directory(
        id=hash_to_bytes("13089e6e544f78df7c9a40a3059050d10dee686a"),
        entries=tuple([
            DirectoryEntry(
                name=b"foo",
                type="file",
                target=content.sha1_git,
                perms=from_disk.DentryPerms.content,
            ),
            DirectoryEntry(
                name=b"subdir",
                type="dir",
                target=directory.id,
                perms=from_disk.DentryPerms.directory,
            ),
            DirectoryEntry(
                name=b"hello",
                type="file",
                target=content2.sha1_git,
                perms=from_disk.DentryPerms.content,
            ),
        ], ),
    )
    directory4 = Directory(
        id=hash_to_bytes("cd5dfd9c09d9e99ed123bc7937a0d5fddc3cd531"),
        entries=tuple([
            DirectoryEntry(
                name=b"subdir1",
                type="dir",
                target=directory3.id,
                perms=from_disk.DentryPerms.directory,
            )
        ], ),
    )

    directory6 = Directory(
        id=hash_to_bytes("afa0105cfcaa14fdbacee344e96659170bb1bda5"),
        entries=tuple([
            DirectoryEntry(
                name=b"foo",
                type="file",
                target=b"\x00" * 20,
                perms=from_disk.DentryPerms.content,
            ),
            DirectoryEntry(
                name=b"bar",
                type="dir",
                target=b"\x01" * 20,
                perms=from_disk.DentryPerms.directory,
            ),
        ], ),
        raw_manifest=(
            b"tree 61\x00"
            b"100644 foo\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"  # noqa
            b"40000 bar\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"  # noqa
        ),
    )

    directories: Tuple[Directory, ...] = (
        directory2,
        directory,
        directory3,
        directory4,
        directory5,
        directory6,
    )

    revision = Revision(
        id=hash_to_bytes("01a7114f36fddd5ef2511b2cadda237a68adbb12"),
        message=b"hello",
        author=Person(
            name=b"Nicolas Dandrimont",
            email=b"*****@*****.**",
            fullname=b"Nicolas Dandrimont <*****@*****.**> ",
        ),
        date=TimestampWithTimezone(
            timestamp=Timestamp(seconds=1234567890, microseconds=0),
            offset_bytes=b"+0200",
        ),
        committer=Person(
            name=b"St\xc3fano Zacchiroli",
            email=b"*****@*****.**",
            fullname=b"St\xc3fano Zacchiroli <*****@*****.**>",
        ),
        committer_date=TimestampWithTimezone(
            timestamp=Timestamp(seconds=1123456789, microseconds=0),
            offset_bytes=b"+0200",
        ),
        parents=(),
        type=RevisionType.GIT,
        directory=directory.id,
        metadata={
            "checksums": {
                "sha1": "tarball-sha1",
                "sha256": "tarball-sha256",
            },
            "signed-off-by": "some-dude",
        },
        extra_headers=(
            (b"gpgsig", b"test123"),
            (b"mergetag", b"foo\\bar"),
            (b"mergetag", b"\x22\xaf\x89\x80\x01\x00"),
        ),
        synthetic=True,
    )
    revision2 = Revision(
        id=hash_to_bytes("a646dd94c912829659b22a1e7e143d2fa5ebde1b"),
        message=b"hello again",
        author=Person(
            name=b"Roberto Dicosmo",
            email=b"*****@*****.**",
            fullname=b"Roberto Dicosmo <*****@*****.**>",
        ),
        date=TimestampWithTimezone(
            timestamp=Timestamp(
                seconds=1234567843,
                microseconds=220000,
            ),
            offset_bytes=b"-1200",
        ),
        committer=Person(
            name=b"tony",
            email=b"*****@*****.**",
            fullname=b"tony <*****@*****.**>",
        ),
        committer_date=TimestampWithTimezone(
            timestamp=Timestamp(
                seconds=1123456789,
                microseconds=220000,
            ),
            offset_bytes=b"+0000",
        ),
        parents=tuple([revision.id]),
        type=RevisionType.GIT,
        directory=directory2.id,
        metadata=None,
        extra_headers=(),
        synthetic=False,
    )
    revision3 = Revision(
        id=hash_to_bytes("beb2844dff30658e27573cb46eb55980e974b391"),
        message=b"a simple revision with no parents this time",
        author=Person(
            name=b"Roberto Dicosmo",
            email=b"*****@*****.**",
            fullname=b"Roberto Dicosmo <*****@*****.**>",
        ),
        date=TimestampWithTimezone(
            timestamp=Timestamp(
                seconds=1234567843,
                microseconds=220000,
            ),
            offset_bytes=b"-1200",
        ),
        committer=Person(
            name=b"tony",
            email=b"*****@*****.**",
            fullname=b"tony <*****@*****.**>",
        ),
        committer_date=TimestampWithTimezone(
            timestamp=Timestamp(
                seconds=1127351742,
                microseconds=220000,
            ),
            offset_bytes=b"+0000",
        ),
        parents=tuple([revision.id, revision2.id]),
        type=RevisionType.GIT,
        directory=directory2.id,
        metadata=None,
        extra_headers=(),
        synthetic=True,
    )
    revision4 = Revision(
        id=hash_to_bytes("ae860aec43700c7f5a295e2ef47e2ae41b535dfe"),
        message=b"parent of self.revision2",
        author=Person(
            name=b"me",
            email=b"*****@*****.**",
            fullname=b"me <*****@*****.**>",
        ),
        date=TimestampWithTimezone(
            timestamp=Timestamp(
                seconds=1234567843,
                microseconds=220000,
            ),
            offset_bytes=b"-1200",
        ),
        committer=Person(
            name=b"committer-dude",
            email=b"*****@*****.**",
            fullname=b"committer-dude <*****@*****.**>",
        ),
        committer_date=TimestampWithTimezone(
            timestamp=Timestamp(
                seconds=1244567843,
                microseconds=220000,
            ),
            offset_bytes=b"-1200",
        ),
        parents=tuple([revision3.id]),
        type=RevisionType.GIT,
        directory=directory.id,
        metadata=None,
        extra_headers=(),
        synthetic=False,
    )
    git_revisions: Tuple[Revision,
                         ...] = (revision, revision2, revision3, revision4)

    hg_revision = Revision(
        id=hash_to_bytes("951c9503541e7beaf002d7aebf2abd1629084c68"),
        message=b"hello",
        author=Person(
            name=b"Nicolas Dandrimont",
            email=b"*****@*****.**",
            fullname=b"Nicolas Dandrimont <*****@*****.**> ",
        ),
        date=TimestampWithTimezone(
            timestamp=Timestamp(seconds=1234567890, microseconds=0),
            offset_bytes=b"+0200",
        ),
        committer=Person(
            name=b"St\xc3fano Zacchiroli",
            email=b"*****@*****.**",
            fullname=b"St\xc3fano Zacchiroli <*****@*****.**>",
        ),
        committer_date=TimestampWithTimezone(
            timestamp=Timestamp(seconds=1123456789, microseconds=0),
            offset_bytes=b"+0200",
        ),
        parents=(),
        type=RevisionType.MERCURIAL,
        directory=directory.id,
        metadata={
            "checksums": {
                "sha1": "tarball-sha1",
                "sha256": "tarball-sha256",
            },
            "signed-off-by": "some-dude",
            "node": "a316dfb434af2b451c1f393496b7eaeda343f543",
        },
        extra_headers=(),
        synthetic=True,
    )
    hg_revision2 = Revision(
        id=hash_to_bytes("df4afb063236300eb13b96a0d7fff03f7b7cbbaf"),
        message=b"hello again",
        author=Person(
            name=b"Roberto Dicosmo",
            email=b"*****@*****.**",
            fullname=b"Roberto Dicosmo <*****@*****.**>",
        ),
        date=TimestampWithTimezone(
            timestamp=Timestamp(
                seconds=1234567843,
                microseconds=220000,
            ),
            offset_bytes=b"-1200",
        ),
        committer=Person(
            name=b"tony",
            email=b"*****@*****.**",
            fullname=b"tony <*****@*****.**>",
        ),
        committer_date=TimestampWithTimezone(
            timestamp=Timestamp(
                seconds=1123456789,
                microseconds=220000,
            ),
            offset_bytes=b"+0000",
        ),
        parents=tuple([hg_revision.id]),
        type=RevisionType.MERCURIAL,
        directory=directory2.id,
        metadata=None,
        extra_headers=(
            (b"node",
             hash_to_bytes("fa1b7c84a9b40605b67653700f268349a6d6aca1")), ),
        synthetic=False,
    )
    hg_revision3 = Revision(
        id=hash_to_bytes("84d8e7081b47ebb88cad9fa1f25de5f330872a37"),
        message=b"a simple revision with no parents this time",
        author=Person(
            name=b"Roberto Dicosmo",
            email=b"*****@*****.**",
            fullname=b"Roberto Dicosmo <*****@*****.**>",
        ),
        date=TimestampWithTimezone(
            timestamp=Timestamp(
                seconds=1234567843,
                microseconds=220000,
            ),
            offset_bytes=b"-1200",
        ),
        committer=Person(
            name=b"tony",
            email=b"*****@*****.**",
            fullname=b"tony <*****@*****.**>",
        ),
        committer_date=TimestampWithTimezone(
            timestamp=Timestamp(
                seconds=1127351742,
                microseconds=220000,
            ),
            offset_bytes=b"+0000",
        ),
        parents=tuple([hg_revision.id, hg_revision2.id]),
        type=RevisionType.MERCURIAL,
        directory=directory2.id,
        metadata=None,
        extra_headers=(
            (b"node",
             hash_to_bytes("7f294a01c49065a90b3fe8b4ad49f08ce9656ef6")), ),
        synthetic=True,
    )
    hg_revision4 = Revision(
        id=hash_to_bytes("4683324ba26dfe941a72cc7552e86eaaf7c27fe3"),
        message=b"parent of self.revision2",
        author=Person(
            name=b"me",
            email=b"*****@*****.**",
            fullname=b"me <*****@*****.**>",
        ),
        date=TimestampWithTimezone(
            timestamp=Timestamp(
                seconds=1234567843,
                microseconds=220000,
            ),
            offset_bytes=b"-1200",
        ),
        committer=Person(
            name=b"committer-dude",
            email=b"*****@*****.**",
            fullname=b"committer-dude <*****@*****.**>",
        ),
        committer_date=TimestampWithTimezone(
            timestamp=Timestamp(
                seconds=1244567843,
                microseconds=220000,
            ),
            offset_bytes=b"-1200",
        ),
        parents=tuple([hg_revision3.id]),
        type=RevisionType.MERCURIAL,
        directory=directory.id,
        metadata=None,
        extra_headers=(
            (b"node",
             hash_to_bytes("f4160af0485c85823d9e829bae2c00b00a2e6297")), ),
        synthetic=False,
    )
    hg_revisions: Tuple[Revision, ...] = (
        hg_revision,
        hg_revision2,
        hg_revision3,
        hg_revision4,
    )
    revisions: Tuple[Revision, ...] = git_revisions + hg_revisions

    origins: Tuple[Origin, ...] = (
        Origin(url="https://github.com/user1/repo1"),
        Origin(url="https://github.com/user2/repo1"),
        Origin(url="https://github.com/user3/repo1"),
        Origin(url="https://gitlab.com/user1/repo1"),
        Origin(url="https://gitlab.com/user2/repo1"),
        Origin(url="https://forge.softwareheritage.org/source/repo1"),
        Origin(url="https://example.рф/🏛️.txt"),
    )
    origin, origin2 = origins[:2]

    metadata_authority = MetadataAuthority(
        type=MetadataAuthorityType.DEPOSIT_CLIENT,
        url="http://hal.inria.example.com/",
    )
    metadata_authority2 = MetadataAuthority(
        type=MetadataAuthorityType.REGISTRY,
        url="http://wikidata.example.com/",
    )
    authorities: Tuple[MetadataAuthority, ...] = (
        metadata_authority,
        metadata_authority2,
    )

    metadata_fetcher = MetadataFetcher(
        name="swh-deposit",
        version="0.0.1",
    )
    metadata_fetcher2 = MetadataFetcher(
        name="swh-example",
        version="0.0.1",
    )
    fetchers: Tuple[MetadataFetcher,
                    ...] = (metadata_fetcher, metadata_fetcher2)

    date_visit1 = datetime.datetime(2015,
                                    1,
                                    1,
                                    23,
                                    0,
                                    0,
                                    tzinfo=datetime.timezone.utc)
    date_visit2 = datetime.datetime(2017,
                                    1,
                                    1,
                                    23,
                                    0,
                                    0,
                                    tzinfo=datetime.timezone.utc)
    date_visit3 = datetime.datetime(2018,
                                    1,
                                    1,
                                    23,
                                    0,
                                    0,
                                    tzinfo=datetime.timezone.utc)

    type_visit1 = "git"
    type_visit2 = "hg"
    type_visit3 = "deb"

    origin_visit = OriginVisit(
        origin=origin.url,
        visit=1,
        date=date_visit1,
        type=type_visit1,
    )
    origin_visit2 = OriginVisit(
        origin=origin.url,
        visit=2,
        date=date_visit2,
        type=type_visit1,
    )
    origin_visit3 = OriginVisit(
        origin=origin2.url,
        visit=1,
        date=date_visit1,
        type=type_visit2,
    )
    origin_visits: Tuple[OriginVisit, ...] = (
        origin_visit,
        origin_visit2,
        origin_visit3,
    )

    release = Release(
        id=hash_to_bytes("f7f222093a18ec60d781070abec4a630c850b837"),
        name=b"v0.0.1",
        author=Person(
            name=b"olasd",
            email=b"*****@*****.**",
            fullname=b"olasd <*****@*****.**>",
        ),
        date=TimestampWithTimezone(
            timestamp=Timestamp(seconds=1234567890, microseconds=0),
            offset_bytes=b"+0042",
        ),
        target=revision.id,
        target_type=ObjectType.REVISION,
        message=b"synthetic release",
        synthetic=True,
    )
    release2 = Release(
        id=hash_to_bytes("db81a26783a3f4a9db07b4759ffc37621f159bb2"),
        name=b"v0.0.2",
        author=Person(
            name=b"tony",
            email=b"*****@*****.**",
            fullname=b"tony <*****@*****.**>",
        ),
        date=TimestampWithTimezone(
            timestamp=Timestamp(seconds=1634366813, microseconds=0),
            offset_bytes=b"-0200",
        ),
        target=revision2.id,
        target_type=ObjectType.REVISION,
        message=b"v0.0.2\nMisc performance improvements + bug fixes",
        synthetic=False,
    )
    release3 = Release(
        id=hash_to_bytes("1c5d42e603ce2eea44917fadca76c78bad76aeb9"),
        name=b"v0.0.2",
        author=Person(
            name=b"tony",
            email=b"*****@*****.**",
            fullname=b"tony <*****@*****.**>",
        ),
        date=TimestampWithTimezone(
            timestamp=Timestamp(seconds=1634366813, microseconds=0),
            offset_bytes=b"-0200",
        ),
        target=revision3.id,
        target_type=ObjectType.REVISION,
        message=b"yet another synthetic release",
        synthetic=True,
    )

    releases: Tuple[Release, ...] = (release, release2, release3)

    snapshot = Snapshot(
        id=hash_to_bytes("9b922e6d8d5b803c1582aabe5525b7b91150788e"),
        branches={
            b"master":
            SnapshotBranch(
                target=revision.id,
                target_type=TargetType.REVISION,
            ),
        },
    )
    empty_snapshot = Snapshot(
        id=hash_to_bytes("1a8893e6a86f444e8be8e7bda6cb34fb1735a00e"),
        branches={},
    )
    complete_snapshot = Snapshot(
        id=hash_to_bytes("db99fda25b43dc5cd90625ee4b0744751799c917"),
        branches={
            b"directory":
            SnapshotBranch(
                target=directory.id,
                target_type=TargetType.DIRECTORY,
            ),
            b"directory2":
            SnapshotBranch(
                target=directory2.id,
                target_type=TargetType.DIRECTORY,
            ),
            b"content":
            SnapshotBranch(
                target=content.sha1_git,
                target_type=TargetType.CONTENT,
            ),
            b"alias":
            SnapshotBranch(
                target=b"revision",
                target_type=TargetType.ALIAS,
            ),
            b"revision":
            SnapshotBranch(
                target=revision.id,
                target_type=TargetType.REVISION,
            ),
            b"release":
            SnapshotBranch(
                target=release.id,
                target_type=TargetType.RELEASE,
            ),
            b"snapshot":
            SnapshotBranch(
                target=empty_snapshot.id,
                target_type=TargetType.SNAPSHOT,
            ),
            b"dangling":
            None,
        },
    )

    snapshots: Tuple[Snapshot,
                     ...] = (snapshot, empty_snapshot, complete_snapshot)

    content_metadata1 = RawExtrinsicMetadata(
        target=ExtendedSWHID(object_type=ExtendedObjectType.CONTENT,
                             object_id=content.sha1_git),
        origin=origin.url,
        discovery_date=datetime.datetime(2015,
                                         1,
                                         1,
                                         21,
                                         0,
                                         0,
                                         tzinfo=datetime.timezone.utc),
        authority=metadata_authority,
        fetcher=metadata_fetcher,
        format="json",
        metadata=b'{"foo": "bar"}',
    )
    content_metadata2 = RawExtrinsicMetadata(
        target=ExtendedSWHID(object_type=ExtendedObjectType.CONTENT,
                             object_id=content.sha1_git),
        origin=origin2.url,
        discovery_date=datetime.datetime(2017,
                                         1,
                                         1,
                                         22,
                                         0,
                                         0,
                                         tzinfo=datetime.timezone.utc),
        authority=metadata_authority,
        fetcher=metadata_fetcher,
        format="yaml",
        metadata=b"foo: bar",
    )
    content_metadata3 = RawExtrinsicMetadata(
        target=ExtendedSWHID(object_type=ExtendedObjectType.CONTENT,
                             object_id=content.sha1_git),
        discovery_date=datetime.datetime(2017,
                                         1,
                                         1,
                                         22,
                                         0,
                                         0,
                                         tzinfo=datetime.timezone.utc),
        authority=attr.evolve(metadata_authority2, metadata=None),
        fetcher=attr.evolve(metadata_fetcher2, metadata=None),
        format="yaml",
        metadata=b"foo: bar",
        origin=origin.url,
        visit=42,
        snapshot=snapshot.swhid(),
        release=release.swhid(),
        revision=revision.swhid(),
        directory=directory.swhid(),
        path=b"/foo/bar",
    )

    content_metadata: Tuple[RawExtrinsicMetadata, ...] = (
        content_metadata1,
        content_metadata2,
        content_metadata3,
    )

    origin_metadata1 = RawExtrinsicMetadata(
        target=Origin(origin.url).swhid(),
        discovery_date=datetime.datetime(2015,
                                         1,
                                         1,
                                         21,
                                         0,
                                         0,
                                         tzinfo=datetime.timezone.utc),
        authority=attr.evolve(metadata_authority, metadata=None),
        fetcher=attr.evolve(metadata_fetcher, metadata=None),
        format="json",
        metadata=b'{"foo": "bar"}',
    )
    origin_metadata2 = RawExtrinsicMetadata(
        target=Origin(origin.url).swhid(),
        discovery_date=datetime.datetime(2017,
                                         1,
                                         1,
                                         22,
                                         0,
                                         0,
                                         tzinfo=datetime.timezone.utc),
        authority=attr.evolve(metadata_authority, metadata=None),
        fetcher=attr.evolve(metadata_fetcher, metadata=None),
        format="yaml",
        metadata=b"foo: bar",
    )
    origin_metadata3 = RawExtrinsicMetadata(
        target=Origin(origin.url).swhid(),
        discovery_date=datetime.datetime(2017,
                                         1,
                                         1,
                                         22,
                                         0,
                                         0,
                                         tzinfo=datetime.timezone.utc),
        authority=attr.evolve(metadata_authority2, metadata=None),
        fetcher=attr.evolve(metadata_fetcher2, metadata=None),
        format="yaml",
        metadata=b"foo: bar",
    )

    origin_metadata: Tuple[RawExtrinsicMetadata, ...] = (
        origin_metadata1,
        origin_metadata2,
        origin_metadata3,
    )

    extid1 = ExtID(
        target=CoreSWHID(object_type=SwhidObjectType.REVISION,
                         object_id=revision.id),
        extid_type="git",
        extid=revision.id,
    )

    extid2 = ExtID(
        target=CoreSWHID(object_type=SwhidObjectType.REVISION,
                         object_id=hg_revision.id),
        extid_type="mercurial",
        extid=hash_to_bytes("a316dfb434af2b451c1f393496b7eaeda343f543"),
    )

    extid3 = ExtID(
        target=CoreSWHID(object_type=SwhidObjectType.DIRECTORY,
                         object_id=directory.id),
        extid_type="directory",
        extid=b"something",
    )
    extid4 = ExtID(
        target=CoreSWHID(object_type=SwhidObjectType.DIRECTORY,
                         object_id=directory2.id),
        extid_type="directory",
        extid=b"something",
        extid_version=2,
    )

    extids: Tuple[ExtID, ...] = (
        extid1,
        extid2,
        extid3,
        extid4,
    )
예제 #21
0
def test_debian_origins_from_row__no_result():
    """Tests debian_origins_from_row when there's no origin, visit, status,
    snapshot, branch, or matching branch.
    """
    storage = get_storage("memory")

    origin_url = "deb://Debian/packages/kalgebra"
    snapshot_id = b"42424242424242424242"
    revision_id = b"21212121212121212121"

    storage.origin_add([Origin(url=origin_url)])

    revision_row = {
        "id": b"\x00\x00\x03l1\x1e\xf3:(\x1b\x05h\x8fn\xad\xcf\xc0\x94:\xee",
        "directory": DIRECTORY_ID,
        "metadata": {
            "original_artifact": [
                {
                    "filename": "kalgebra_19.12.1-1.dsc",
                },
            ]
        },
    }

    # no visit
    assert debian_origins_from_row(revision_row, storage) == []

    storage.origin_visit_add(
        [OriginVisit(
            origin=origin_url,
            date=now(),
            type="deb",
            visit=280,
        )])

    # no status
    assert debian_origins_from_row(revision_row, storage) == []

    status = OriginVisitStatus(
        origin=origin_url,
        visit=280,
        date=now(),
        status="full",
        snapshot=None,
        metadata=None,
    )
    storage.origin_visit_status_add([status])

    # no snapshot
    assert debian_origins_from_row(revision_row, storage) == []

    status = attr.evolve(status, snapshot=snapshot_id, date=now())
    storage.origin_visit_status_add([status])

    storage_before_snapshot = copy.deepcopy(storage)

    snapshot = Snapshot(id=snapshot_id, branches={})
    storage.snapshot_add([snapshot])

    # no branch
    assert debian_origins_from_row(revision_row, storage) == []

    # "remove" the snapshot, so we can add a new one with the same id
    storage = copy.deepcopy(storage_before_snapshot)

    snapshot = attr.evolve(
        snapshot,
        branches={
            b"foo": None,
        },
    )
    storage.snapshot_add([snapshot])

    # dangling branch
    assert debian_origins_from_row(revision_row, storage) == []

    # "remove" the snapshot again
    storage = copy.deepcopy(storage_before_snapshot)

    snapshot = attr.evolve(
        snapshot,
        branches={
            b"foo":
            SnapshotBranch(
                target_type=TargetType.REVISION,
                target=revision_id,
            )
        },
    )
    storage.snapshot_add([snapshot])

    # branch points to unknown revision
    assert debian_origins_from_row(revision_row, storage) == []

    revision = Revision(
        id=revision_id,
        message=b"foo",
        author=Person.from_fullname(b"foo"),
        committer=Person.from_fullname(b"foo"),
        date=TimestampWithTimezone(
            timestamp=Timestamp(seconds=1580076204, microseconds=0),
            offset_bytes=b"+0100",
        ),
        committer_date=TimestampWithTimezone(
            timestamp=Timestamp(seconds=1580076204, microseconds=0),
            offset_bytes=b"+0100",
        ),
        type=RevisionType.DSC,
        directory=
        b"\xd5\x9a\x1f\x9c\x80\x9d\x8c}19P\xf6\xc8\xa2\x0f^%H\xcd\xdb",
        synthetic=True,
        metadata=None,
        parents=(),
        extra_headers=(),
    )

    storage.revision_add([revision])

    # no matching branch
    assert debian_origins_from_row(revision_row, storage) == []