• Carlos Ramos Carreño's avatar
    wcfs: _mntpt_4zurl: Fix it to accept strings. · 07087ec8
    Carlos Ramos Carreño authored
    Strings cannot be directly hashed without encoding them first, or
    an error will be raised:
    
    ```python
    ______________________________ test_zsync_resync _______________________________
    
        @func
        def test_zsync_resync():
            zstor = testdb.getZODBStorage()
            defer(zstor.close)
    
    >       db, zconn, wconn = _zsync_setup(zstor)
    
    wcfs/client/_wczsync_test.py:112:
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    ../../venvs/wendelin.core/lib/python3.9/site-packages/decorator.py:232: in fun
        return caller(func, *(extras + args), **kw)
    ../pygolang/golang/__init__.py:125: in _
        return f(*argv, **kw)
    wcfs/client/_wczsync_test.py:53: in _zsync_setup
        wc = wcfs.join(zurl)
    wcfs/__init__.py:201: in join
        mntpt = _mntpt_4zurl(zurl)
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    
    zurl = 'file:///srv/slapgrid/slappart66/tmp/testdb_fs.xstpbg49/1.fs'
    
        def _mntpt_4zurl(zurl):
            # normalize zurl so that even if we have e.g. two neos:// urls coming
            # with different paths to ssl keys, or with different order in the list of
            # masters, we still have them associated with the same wcfs mountpoint.
            zurl = zurl_normalize_main(zurl)
    
            m = hashlib.sha1()
    >       m.update(zurl)
    E       TypeError: Strings must be encoded before hashing
    ```
    
    We fix this error by encoding the string as UTF8 before hashing it.
    
    --------
    kirr:
    
    Use b instead of doing
    
        if isinstance(zurl, six.text_type):
          zurl = zurl.encode("utf-8")
    
    wcfs already takes this approach of using b in other places - for
    example in tDB.change:
    
        # change schedules zf to be changed according to changeDelta at commit.
        #
        # changeDelta: {} blk -> data.
        # data can be both bytes and unicode.              <-- NOTE
        def change(t, zf, changeDelta):
            assert isinstance(zf, ZBigFile)
            zfDelta = t._changed.setdefault(zf, {})
            for blk, data in six.iteritems(changeDelta):
                data = b(data)                             <-- NOTE
                ...
    
    /reviewed-by @kirr
    /reviewed-on nexedi/wendelin.core!27
    07087ec8
__init__.py 24.9 KB