convert-nfd-unicode-filesystem-to-nfc-unicode / src / convertnfdunicodefilesystemtonfcunicode / __init__.py

import os
import sys
import unicodedata
from urlparse import urlparse
from uuid import uuid4

from docopt import docopt


def fix_unicode(path, verbose=True):
    for root, dirs, files in os.walk(unicode(path), topdown=False):
        for entry in files:
            nfc = unicodedata.normalize('NFC', entry)
            if entry != nfc:
                os.rename(
                    os.path.join(root, entry),
                    os.path.join(root, nfc))

                if verbose:
                    print os.path.join(root, nfc)

        rootparent, rootentry = os.path.split(root)
        nfc = unicodedata.normalize('NFC', rootentry)
        if rootentry != nfc:
            os.rename(root, os.path.join(rootparent, nfc))
            if verbose:
                print os.path.join(rootparent, nfc)

remote_cmd = """
import os
import sys
import unicodedata

def fix_unicode(path, verbose=True):
    for root, dirs, files in os.walk(unicode(path), topdown=False):
        for entry in files:
            nfc = unicodedata.normalize('NFC', entry)
            if entry != nfc:
                os.rename(
                    os.path.join(root, entry),
                    os.path.join(root, nfc))

                if verbose:
                    print os.path.join(root, nfc)

        rootparent, rootentry = os.path.split(root)
        nfc = unicodedata.normalize('NFC', rootentry)
        if rootentry != nfc:
            os.rename(root, os.path.join(rootparent, nfc))
            if verbose:
                print os.path.join(rootparent, nfc)

if __name__ == '__main__':
    fix_unicode('''%(path)s''', False)
"""


def main():
    arguments = docopt(
"""This tool can convert file system encoded in NFD mode to NFC mode.

On Mac OS X, the filesystem encode file name in NFD unicode 
(http://en.wikipedia.org/wiki/Unicode_normalization#Example).
On GNU/Linux, by default the filesystem encode file name in NFC unicode
but it can also contain file encoded in NFD mode.
You can use this tool to convert NFD to NFC.

Usage:
  convert-nfd-unicode-filesystem-to-nfc-unicode <path>
  convert-nfd-unicode-filesystem-to-nfc-unicode <url>
  convert-nfd-unicode-filesystem-to-nfc-unicode -h | --help | --version

Examples :

Convert on local file system (use it on GNU/Linux, not on Mac OS X) :

    $ convert-nfd-unicode-filesystem-to-nfc-unicode /home/username/myproject/

You can use ssh url syntax to fix unicode on remote host :

    $ convert-nfd-unicode-filesystem-to-nfc-unicode foobar@example.com:2000:/home/foobar/www/

Home page : https://bitbucket.org/harobed/convert-nfd-unicode-filesystem-to-nfc-unicode
""",
        version='0.1.0'
    )
    path = arguments['<path>']
    if path.startswith('ssh://'):
        url = urlparse(path)
        assert url.scheme == 'ssh'
        host = url.netloc
        port = 22
        user = os.getlogin()
        if ':' in host:
            host, port = host.split(':')

        if '@' in host:
            user, host = host.split('@')

        path_tmpfile = os.tempnam()
        basename_tmpfile = os.path.basename(path_tmpfile)  # NOQA
        f = open(path_tmpfile, 'w')
        f.write(remote_cmd % {'path': url.path})
        f.close()
        print('scp -P %(port)s %(path_tmpfile)s %(user)s@%(host)s/tmp/' % locals())
        os.system('scp -P %(port)s %(path_tmpfile)s %(user)s@%(host)s:/tmp/' % locals())
        print('ssh -p %(port)s %(user)s@%(host)s python /tmp/%(basename_tmpfile)s' % locals())
        os.system('ssh -p %(port)s %(user)s@%(host)s python /tmp/%(basename_tmpfile)s' % locals())
    else:
        if not os.path.exists(path):
            sys.exit('Error, folder not found %s' % path)

        fix_unicode(path)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.