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:
Doug Felt 2017-05-16 13:04:53 -07:00
parent 3fb9bf6158
commit 029f65ee98

View file

@ -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 = []
alias_exists = False
for als, trg in sorted(aliases.items()): 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__':