mirror of
https://github.com/googlefonts/noto-emoji.git
synced 2025-06-08 15:57:59 +00:00
Update add_aliases to optionally create copies.
Once again we need to create aliases, slightly differently. In this case we want to generate new copies of files, not symlinks, and generate the copies in a new location. So add these options.
This commit is contained in:
parent
3fb9bf6158
commit
029f65ee98
1 changed files with 60 additions and 17 deletions
|
@ -18,6 +18,7 @@ import argparse
|
||||||
import glob
|
import glob
|
||||||
import os
|
import os
|
||||||
from os import path
|
from os import path
|
||||||
|
import shutil
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
"""Create aliases in target directory.
|
"""Create aliases in target directory.
|
||||||
|
@ -28,7 +29,11 @@ codepoint in their names."""
|
||||||
DATA_ROOT = path.dirname(path.abspath(__file__))
|
DATA_ROOT = path.dirname(path.abspath(__file__))
|
||||||
|
|
||||||
def str_to_seq(seq_str):
|
def str_to_seq(seq_str):
|
||||||
return tuple([int(s, 16) for s in seq_str.split('_')])
|
res = [int(s, 16) for s in seq_str.split('_')]
|
||||||
|
if 0xfe0f in res:
|
||||||
|
print '0xfe0f in file name: %s' % seq_str
|
||||||
|
res = [x for x in res if x != 0xfe0f]
|
||||||
|
return tuple(res)
|
||||||
|
|
||||||
|
|
||||||
def seq_to_str(seq):
|
def seq_to_str(seq):
|
||||||
|
@ -67,42 +72,61 @@ def read_emoji_aliases(filename):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def add_aliases(filedir, prefix, ext, replace=False, dry_run=False):
|
def add_aliases(
|
||||||
if not path.isdir(filedir):
|
srcdir, dstdir, aliasfile, prefix, ext, replace=False, copy=False,
|
||||||
print >> sys.stderr, '%s is not a directory' % filedir
|
dry_run=False):
|
||||||
|
"""Use aliasfile to create aliases of files in srcdir matching prefix/ext in
|
||||||
|
dstdir. If dstdir is null, use srcdir as dstdir. If replace is false
|
||||||
|
and a file already exists in dstdir, report and do nothing. If copy is false
|
||||||
|
create a symlink, else create a copy. If dry_run is true, report what would
|
||||||
|
be done. Dstdir will be created if necessary, even if dry_run is true."""
|
||||||
|
|
||||||
|
if not path.isdir(srcdir):
|
||||||
|
print >> sys.stderr, '%s is not a directory' % srcdir
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if not dstdir:
|
||||||
|
dstdir = srcdir
|
||||||
|
elif not path.isdir(dstdir):
|
||||||
|
os.makedirs(dstdir)
|
||||||
|
|
||||||
prefix_len = len(prefix)
|
prefix_len = len(prefix)
|
||||||
suffix_len = len(ext) + 1
|
suffix_len = len(ext) + 1
|
||||||
filenames = [path.basename(f)
|
filenames = [path.basename(f)
|
||||||
for f in glob.glob(path.join(filedir, '%s*.%s' % (prefix, ext)))]
|
for f in glob.glob(path.join(srcdir, '%s*.%s' % (prefix, ext)))]
|
||||||
seq_to_file = {
|
seq_to_file = {
|
||||||
str_to_seq(name[prefix_len:-suffix_len]) : name
|
str_to_seq(name[prefix_len:-suffix_len]) : name
|
||||||
for name in filenames}
|
for name in filenames}
|
||||||
|
|
||||||
aliases = read_emoji_aliases()
|
aliases = read_emoji_aliases(aliasfile)
|
||||||
aliases_to_create = {}
|
aliases_to_create = {}
|
||||||
aliases_to_replace = []
|
aliases_to_replace = []
|
||||||
for als,trg in sorted(aliases.items()):
|
alias_exists = False
|
||||||
|
for als, trg in sorted(aliases.items()):
|
||||||
if trg not in seq_to_file:
|
if trg not in seq_to_file:
|
||||||
print >> sys.stderr, 'target %s for %s does not exist' % (
|
print >> sys.stderr, 'target %s for %s does not exist' % (
|
||||||
seq_to_str(trg), seq_to_str(als))
|
seq_to_str(trg), seq_to_str(als))
|
||||||
continue
|
continue
|
||||||
if als in seq_to_file:
|
alias_name = '%s%s.%s' % (prefix, seq_to_str(als), ext)
|
||||||
|
alias_path = path.join(dstdir, alias_name)
|
||||||
|
if path.exists(alias_path):
|
||||||
if replace:
|
if replace:
|
||||||
aliases_to_replace.append(seq_to_file[als])
|
aliases_to_replace.append(alias_name)
|
||||||
else:
|
else:
|
||||||
print >> sys.stderr, 'alias %s exists' % seq_to_str(als)
|
print >> sys.stderr, 'alias %s exists' % seq_to_str(als)
|
||||||
|
alias_exists = True
|
||||||
continue
|
continue
|
||||||
target_file = seq_to_file[trg]
|
target_file = seq_to_file[trg]
|
||||||
alias_name = '%s%s.%s' % (prefix, seq_to_str(als), ext)
|
|
||||||
aliases_to_create[alias_name] = target_file
|
aliases_to_create[alias_name] = target_file
|
||||||
|
|
||||||
if replace:
|
if replace:
|
||||||
if not dry_run:
|
if not dry_run:
|
||||||
for k in sorted(aliases_to_replace):
|
for k in sorted(aliases_to_replace):
|
||||||
os.remove(path.join(filedir, k))
|
os.remove(path.join(dstdir, k))
|
||||||
print 'replacing %d files' % len(aliases_to_replace)
|
print 'replacing %d files' % len(aliases_to_replace)
|
||||||
|
elif alias_exists:
|
||||||
|
print >> sys.stderr, 'aborting, aliases exist.'
|
||||||
|
return
|
||||||
|
|
||||||
for k, v in sorted(aliases_to_create.items()):
|
for k, v in sorted(aliases_to_create.items()):
|
||||||
if dry_run:
|
if dry_run:
|
||||||
|
@ -110,18 +134,32 @@ def add_aliases(filedir, prefix, ext, replace=False, dry_run=False):
|
||||||
print '%s%s -> %s' % (msg, k, v)
|
print '%s%s -> %s' % (msg, k, v)
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
os.symlink(v, path.join(filedir, k))
|
if copy:
|
||||||
except:
|
shutil.copy2(path.join(srcdir, v), path.join(dstdir, k))
|
||||||
|
else:
|
||||||
|
# fix this to create relative symlinks
|
||||||
|
if srcdir == dstdir:
|
||||||
|
os.symlink(v, path.join(dstdir, k))
|
||||||
|
else:
|
||||||
|
raise Exception('can\'t create cross-directory symlinks yet')
|
||||||
|
except Exception as e:
|
||||||
print >> sys.stderr, 'failed to create %s -> %s' % (k, v)
|
print >> sys.stderr, 'failed to create %s -> %s' % (k, v)
|
||||||
raise Exception('oops')
|
raise Exception('oops, ' + str(e))
|
||||||
print 'created %d symlinks' % len(aliases_to_create)
|
print 'created %d %s' % (
|
||||||
|
len(aliases_to_create), 'copies' if copy else 'symlinks')
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-d', '--filedir', help='directory containing files to alias',
|
'-s', '--srcdir', help='directory containing files to alias',
|
||||||
required=True, metavar='dir')
|
required=True, metavar='dir')
|
||||||
|
parser.add_argument(
|
||||||
|
'-d', '--dstdir', help='directory to write aliases, default srcdir',
|
||||||
|
metavar='dir')
|
||||||
|
parser.add_argument(
|
||||||
|
'-a', '--aliasfile', help='alias file (default emoji_aliases.txt)',
|
||||||
|
metavar='file', default='emoji_aliases.txt')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-p', '--prefix', help='file name prefix (default emoji_u)',
|
'-p', '--prefix', help='file name prefix (default emoji_u)',
|
||||||
metavar='pfx', default='emoji_u')
|
metavar='pfx', default='emoji_u')
|
||||||
|
@ -131,12 +169,17 @@ def main():
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-r', '--replace', help='replace existing files/aliases',
|
'-r', '--replace', help='replace existing files/aliases',
|
||||||
action='store_true')
|
action='store_true')
|
||||||
|
parser.add_argument(
|
||||||
|
'-c', '--copy', help='create a copy of the file, not a symlink',
|
||||||
|
action='store_true')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-n', '--dry_run', help='print out aliases to create only',
|
'-n', '--dry_run', help='print out aliases to create only',
|
||||||
action='store_true')
|
action='store_true')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
add_aliases(args.filedir, args.prefix, args.ext, args.replace, args.dry_run)
|
add_aliases(
|
||||||
|
args.srcdir, args.dstdir, args.aliasfile, args.prefix, args.ext,
|
||||||
|
args.replace, args.copy, args.dry_run)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
Loading…
Add table
Reference in a new issue