From 029f65ee9813ac889803eaf31ba2b57a6ae39ff6 Mon Sep 17 00:00:00 2001 From: Doug Felt Date: Tue, 16 May 2017 13:04:53 -0700 Subject: [PATCH] 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. --- add_aliases.py | 77 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 17 deletions(-) diff --git a/add_aliases.py b/add_aliases.py index 615d226f6..55722e3fa 100755 --- a/add_aliases.py +++ b/add_aliases.py @@ -18,6 +18,7 @@ import argparse import glob import os from os import path +import shutil import sys """Create aliases in target directory. @@ -28,7 +29,11 @@ codepoint in their names.""" DATA_ROOT = path.dirname(path.abspath(__file__)) 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): @@ -67,42 +72,61 @@ def read_emoji_aliases(filename): return result -def add_aliases(filedir, prefix, ext, replace=False, dry_run=False): - if not path.isdir(filedir): - print >> sys.stderr, '%s is not a directory' % filedir +def add_aliases( + srcdir, dstdir, aliasfile, prefix, ext, replace=False, copy=False, + 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 + if not dstdir: + dstdir = srcdir + elif not path.isdir(dstdir): + os.makedirs(dstdir) + prefix_len = len(prefix) suffix_len = len(ext) + 1 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 = { str_to_seq(name[prefix_len:-suffix_len]) : name for name in filenames} - aliases = read_emoji_aliases() + aliases = read_emoji_aliases(aliasfile) aliases_to_create = {} 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: print >> sys.stderr, 'target %s for %s does not exist' % ( seq_to_str(trg), seq_to_str(als)) 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: - aliases_to_replace.append(seq_to_file[als]) + aliases_to_replace.append(alias_name) else: print >> sys.stderr, 'alias %s exists' % seq_to_str(als) + alias_exists = True continue target_file = seq_to_file[trg] - alias_name = '%s%s.%s' % (prefix, seq_to_str(als), ext) aliases_to_create[alias_name] = target_file if replace: if not dry_run: 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) + elif alias_exists: + print >> sys.stderr, 'aborting, aliases exist.' + return for k, v in sorted(aliases_to_create.items()): 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) else: try: - os.symlink(v, path.join(filedir, k)) - except: + if copy: + 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) - raise Exception('oops') - print 'created %d symlinks' % len(aliases_to_create) + raise Exception('oops, ' + str(e)) + print 'created %d %s' % ( + len(aliases_to_create), 'copies' if copy else 'symlinks') def main(): parser = argparse.ArgumentParser() parser.add_argument( - '-d', '--filedir', help='directory containing files to alias', + '-s', '--srcdir', help='directory containing files to alias', 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( '-p', '--prefix', help='file name prefix (default emoji_u)', metavar='pfx', default='emoji_u') @@ -131,12 +169,17 @@ def main(): parser.add_argument( '-r', '--replace', help='replace existing files/aliases', action='store_true') + parser.add_argument( + '-c', '--copy', help='create a copy of the file, not a symlink', + action='store_true') parser.add_argument( '-n', '--dry_run', help='print out aliases to create only', action='store_true') 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__':