def create_info_files(m, files, config, prefix): ''' Creates the metadata files that will be stored in the built package. :param m: Package metadata :type m: Metadata :param files: Paths to files to include in package :type files: list of str ''' copy_recipe(m, config) copy_readme(m, config) copy_license(m, config) mode_dict = {'mode': 'w', 'encoding': 'utf-8'} if PY3 else {'mode': 'wb'} write_info_json(m, config, mode_dict) write_about_json(m, config) entry_point_scripts = get_entry_points(config, m) if is_noarch_python(m): noarch_python.create_entry_point_information( "python", entry_point_scripts, config ) entry_point_script_names = get_entry_point_script_names(entry_point_scripts) if on_win: # make sure we use '/' path separators in metadata files = [_f.replace('\\', '/') for _f in files] with open(join(config.info_dir, 'files'), **mode_dict) as fo: if m.get_value('build/noarch_python'): fo.write('\n') elif is_noarch_python(m): for f in files: if f.find("site-packages") > 0: fo.write(f[f.find("site-packages"):] + '\n') elif f.startswith("bin") and (f not in entry_point_script_names): fo.write(f.replace("bin", "python-scripts") + '\n') elif f.startswith("Scripts") and (f not in entry_point_script_names): fo.write(f.replace("Scripts", "python-scripts") + '\n') else: for f in files: fo.write(f + '\n') detect_and_record_prefix_files(m, files, prefix, config) write_no_link(m, config, files) if m.get_value('source/git_url'): with io.open(join(config.info_dir, 'git'), 'w', encoding='utf-8') as fo: source.git_info(config, fo) if m.get_value('app/icon'): copy_into(join(m.path, m.get_value('app/icon')), join(config.info_dir, 'icon.png'), config.timeout)
def create_info_files(m, files, config, prefix): ''' Creates the metadata files that will be stored in the built package. :param m: Package metadata :type m: Metadata :param files: Paths to files to include in package :type files: list of str ''' copy_recipe(m, config) copy_readme(m, config) copy_license(m, config) mode_dict = {'mode': 'w', 'encoding': 'utf-8'} if PY3 else {'mode': 'wb'} write_info_json(m, config, mode_dict) write_about_json(m, config) entry_point_scripts = m.get_value('build/entry_points') if is_noarch_python(m): noarch_python.create_entry_point_information( "python", entry_point_scripts, config ) entry_point_script_names = get_entry_point_script_names(entry_point_scripts) if on_win: # make sure we use '/' path separators in metadata files = [_f.replace('\\', '/') for _f in files] with open(join(config.info_dir, 'files'), **mode_dict) as fo: if m.get_value('build/noarch_python'): fo.write('\n') elif is_noarch_python(m): for f in files: if f.find("site-packages") > 0: fo.write(f[f.find("site-packages"):] + '\n') elif f.startswith("bin") and (f not in entry_point_script_names): fo.write(f.replace("bin", "python-scripts") + '\n') elif f.startswith("Scripts") and (f not in entry_point_script_names): fo.write(f.replace("Scripts", "python-scripts") + '\n') else: for f in files: fo.write(f + '\n') detect_and_record_prefix_files(m, files, prefix, config) write_no_link(m, config, files) if m.get_value('source/git_url'): with io.open(join(config.info_dir, 'git'), 'w', encoding='utf-8') as fo: source.git_info(config, fo) if m.get_value('app/icon'): copy_into(join(m.path, m.get_value('app/icon')), join(config.info_dir, 'icon.png'), config.timeout)
def create_info_files(m, files): recipe_dir = join(info_dir, 'recipe') os.makedirs(recipe_dir) for fn in os.listdir(m.path): if fn.startswith('.'): continue src_path = join(m.path, fn) dst_path = join(recipe_dir, fn) if isdir(src_path): shutil.copytree(src_path, dst_path) else: shutil.copy(src_path, dst_path) with open(join(info_dir, 'files'), 'w') as fo: for f in files: if sys.platform == 'win32': f = f.replace('\\', '/') fo.write(f + '\n') with open(join(info_dir, 'index.json'), 'w') as fo: json.dump(m.info_index(), fo, indent=2, sort_keys=True) with open(join(info_dir, 'recipe.json'), 'w') as fo: json.dump(m.meta, fo, indent=2, sort_keys=True) if sys.platform != 'win32': prefix_files = list(have_prefix_files(files)) if prefix_files: with open(join(info_dir, 'has_prefix'), 'w') as fo: for f in prefix_files: fo.write(f + '\n') no_soft_rx = m.get_value('build/no_softlink') if no_soft_rx: pat = re.compile(no_soft_rx) with open(join(info_dir, 'no_softlink'), 'w') as fo: for f in files: if pat.match(f): fo.write(f + '\n') if m.get_value('source/git_url'): with open(join(info_dir, 'git'), 'w') as fo: source.git_info(fo) if m.get_value('app/icon'): shutil.copyfile(join(m.path, m.get_value('app/icon')), join(info_dir, 'icon.png'))
def create_info_files(m, files, config, prefix): ''' Creates the metadata files that will be stored in the built package. :param m: Package metadata :type m: Metadata :param files: Paths to files to include in package :type files: list of str :param include_recipe: Whether or not to include the recipe (True by default) :type include_recipe: bool ''' if not isdir(config.info_dir): os.makedirs(config.info_dir) copy_recipe(m, config) copy_readme(m, config) copy_license(m, config) mode_dict = {'mode': 'w', 'encoding': 'utf-8'} if PY3 else {'mode': 'wb'} write_info_json(m, config, mode_dict) write_about_json(m, config) if on_win: # make sure we use '/' path separators in metadata files = [_f.replace('\\', '/') for _f in files] with open(join(config.info_dir, 'files'), **mode_dict) as fo: if m.get_value('build/noarch_python'): fo.write('\n') else: for f in files: fo.write(f + '\n') detect_and_record_prefix_files(m, files, prefix, config) write_no_link(m, config, files) if m.get_value('source/git_url'): with io.open(join(config.info_dir, 'git'), 'w', encoding='utf-8') as fo: source.git_info(config, fo) if m.get_value('app/icon'): copy_into(join(m.path, m.get_value('app/icon')), join(config.info_dir, 'icon.png'), config.timeout)
def create_info_files(m, files, config, prefix): ''' Creates the metadata files that will be stored in the built package. :param m: Package metadata :type m: Metadata :param files: Paths to files to include in package :type files: list of str :param include_recipe: Whether or not to include the recipe (True by default) :type include_recipe: bool ''' if not isdir(config.info_dir): os.makedirs(config.info_dir) copy_recipe(m, config) copy_readme(m, config) copy_license(m, config) mode_dict = {'mode': 'w', 'encoding': 'utf-8'} if PY3 else {'mode': 'wb'} write_info_json(m, config, mode_dict) write_about_json(m, config) if on_win: # make sure we use '/' path separators in metadata files = [_f.replace('\\', '/') for _f in files] with open(join(config.info_dir, 'files'), **mode_dict) as fo: if m.get_value('build/noarch_python'): fo.write('\n') else: for f in files: fo.write(f + '\n') detect_and_record_prefix_files(m, files, prefix, config) write_no_link(m, config, files) if m.get_value('source/git_url'): with io.open(join(config.info_dir, 'git'), 'w', encoding='utf-8') as fo: source.git_info(config, fo) if m.get_value('app/icon'): copy_into(join(m.path, m.get_value('app/icon')), join(config.info_dir, 'icon.png'), config.timeout)
def create_info_files(m, files, include_recipe=True): ''' Creates the metadata files that will be stored in the built package. :param m: Package metadata :type m: Metadata :param files: Paths to files to include in package :type files: list of str :param include_recipe: Whether or not to include the recipe (True by default) :type include_recipe: bool ''' recipe_dir = join(info_dir, 'recipe') os.makedirs(recipe_dir) if include_recipe: for fn in os.listdir(m.path): if fn.startswith('.'): continue src_path = join(m.path, fn) dst_path = join(recipe_dir, fn) if isdir(src_path): shutil.copytree(src_path, dst_path) else: shutil.copy(src_path, dst_path) if isfile(join(recipe_dir, 'meta.yaml')): shutil.move(join(recipe_dir, 'meta.yaml'), join(recipe_dir, 'meta.yaml.orig')) with open(join(recipe_dir, 'meta.yaml'), 'w', encoding='utf-8') as fo: yaml.safe_dump(m.meta, fo) with open(join(info_dir, 'files'), 'w', encoding='utf-8') as fo: for f in files: if sys.platform == 'win32': f = f.replace('\\', '/') fo.write(f + '\n') # Deal with Python 2 and 3's different json module type reqs mode_dict = {'mode': 'w', 'encoding': 'utf-8'} if PY3 else {'mode': 'wb'} with open(join(info_dir, 'index.json'), **mode_dict) as fo: json.dump(m.info_index(), fo, indent=2, sort_keys=True) with open(join(info_dir, 'recipe.json'), **mode_dict) as fo: json.dump(m.meta, fo, indent=2, sort_keys=True) files_with_prefix = m.has_prefix_files() for file in files_with_prefix: if file not in files: raise RuntimeError("file %s from build/has_prefix_files was " "not found" % file) if sys.platform != 'win32': files_with_prefix += list(have_prefix_files(files)) files_with_prefix = sorted(set(files_with_prefix)) if files_with_prefix: with open(join(info_dir, 'has_prefix'), 'w', encoding='utf-8') as fo: for f in files_with_prefix: fo.write(f + '\n') no_link = m.get_value('build/no_link') if no_link: def w2rx(p): return p.replace('.', r'\.').replace('*', r'.*') if not isinstance(no_link, list): no_link = [no_link] rx = '(%s)$' % '|'.join(w2rx(p) for p in no_link) pat = re.compile(rx) with open(join(info_dir, 'no_link'), 'w', encoding='utf-8') as fo: for f in files: if pat.match(f): fo.write(f + '\n') if m.get_value('source/git_url'): with open(join(info_dir, 'git'), 'w', encoding='utf-8') as fo: source.git_info(fo) if m.get_value('app/icon'): shutil.copyfile(join(m.path, m.get_value('app/icon')), join(info_dir, 'icon.png'))
def create_info_files(m, files, include_recipe=True): ''' Creates the metadata files that will be stored in the built package. :param m: Package metadata :type m: Metadata :param files: Paths to files to include in package :type files: list of str :param include_recipe: Whether or not to include the recipe (True by default) :type include_recipe: bool ''' recipe_dir = join(config.info_dir, 'recipe') os.makedirs(recipe_dir) if include_recipe: for fn in os.listdir(m.path): if fn.startswith('.'): continue src_path = join(m.path, fn) dst_path = join(recipe_dir, fn) if isdir(src_path): shutil.copytree(src_path, dst_path) else: shutil.copy(src_path, dst_path) if isfile(join(recipe_dir, 'meta.yaml')): shutil.move(join(recipe_dir, 'meta.yaml'), join(recipe_dir, 'meta.yaml.orig')) with open(join(recipe_dir, 'meta.yaml'), 'w') as fo: yaml.safe_dump(m.meta, fo) readme = m.get_value('about/readme') if readme: src = join(source.get_dir(), readme) if not os.path.exists(src): sys.exit("Error: Could not find the readme: %s" % readme) dst = join(config.info_dir, readme) shutil.copy(src, dst) if os.path.split(readme)[1] not in {"README.md", "README.rst", "README"}: print("WARNING: Binstar only recognizes about/readme as README.md and README.rst", file=sys.stderr) # Deal with Python 2 and 3's different json module type reqs mode_dict = {'mode': 'w', 'encoding': 'utf-8'} if PY3 else {'mode': 'wb'} with open(join(config.info_dir, 'index.json'), **mode_dict) as fo: json.dump(m.info_index(), fo, indent=2, sort_keys=True) with open(join(config.info_dir, 'recipe.json'), **mode_dict) as fo: json.dump(m.meta, fo, indent=2, sort_keys=True) if sys.platform == 'win32': # make sure we use '/' path separators in metadata files = [f.replace('\\', '/') for f in files] with open(join(config.info_dir, 'files'), 'w') as fo: if m.get_value('build/noarch_python'): fo.write('\n') else: for f in files: fo.write(f + '\n') files_with_prefix = sorted(have_prefix_files(files)) binary_has_prefix_files = m.binary_has_prefix_files() text_has_prefix_files = m.has_prefix_files() if files_with_prefix and not m.get_value('build/noarch_python'): auto_detect = m.get_value('build/detect_binary_files_with_prefix') if sys.platform == 'win32': # Paths on Windows can contain spaces, so we need to quote the # paths. Fortunately they can't contain quotes, so we don't have # to worry about nested quotes. fmt_str = '"%s" %s "%s"\n' else: # Don't do it everywhere because paths on Unix can contain quotes, # and we don't have a good method of escaping, and because older # versions of conda don't support quotes in has_prefix fmt_str = '%s %s %s\n' with open(join(config.info_dir, 'has_prefix'), 'w') as fo: for pfix, mode, fn in files_with_prefix: if (fn in text_has_prefix_files): # register for text replacement, regardless of mode fo.write(fmt_str % (pfix, 'text', fn)) text_has_prefix_files.remove(fn) elif ((mode == 'binary') and (fn in binary_has_prefix_files)): print("Detected hard-coded path in binary file %s" % fn) fo.write(fmt_str % (pfix, mode, fn)) binary_has_prefix_files.remove(fn) elif (auto_detect or (mode == 'text')): print("Detected hard-coded path in %s file %s" % (mode, fn)) fo.write(fmt_str % (pfix, mode, fn)) else: print("Ignored hard-coded path in %s" % fn) # make sure we found all of the files expected errstr = "" for f in text_has_prefix_files: errstr += "Did not detect hard-coded path in %s from has_prefix_files\n" % f for f in binary_has_prefix_files: errstr += "Did not detect hard-coded path in %s from binary_has_prefix_files\n" % f if errstr: raise RuntimeError(errstr) no_link = m.get_value('build/no_link') if no_link: if not isinstance(no_link, list): no_link = [no_link] with open(join(config.info_dir, 'no_link'), 'w') as fo: for f in files: if any(fnmatch.fnmatch(f, p) for p in no_link): fo.write(f + '\n') if m.get_value('source/git_url'): with io.open(join(config.info_dir, 'git'), 'w', encoding='utf-8') as fo: source.git_info(fo) if m.get_value('app/icon'): shutil.copyfile(join(m.path, m.get_value('app/icon')), join(config.info_dir, 'icon.png'))
def create_info_files(m, files, include_recipe=True): ''' Creates the metadata files that will be stored in the built package. :param m: Package metadata :type m: Metadata :param files: Paths to files to include in package :type files: list of str :param include_recipe: Whether or not to include the recipe (True by default) :type include_recipe: bool ''' if not isdir(config.info_dir): os.makedirs(config.info_dir) if include_recipe: recipe_dir = join(config.info_dir, 'recipe') os.makedirs(recipe_dir) for fn in os.listdir(m.path): if fn.startswith('.'): continue src_path = join(m.path, fn) dst_path = join(recipe_dir, fn) if isdir(src_path): shutil.copytree(src_path, dst_path) else: shutil.copy(src_path, dst_path) license_file = m.get_value('about/license_file') if license_file: filenames = 'LICENSE', 'LICENSE.txt', 'license', 'license.txt' if license_file is True: for fn in filenames: src = join(source.get_dir(), fn) if isfile(src): break else: sys.exit("Error: could not locate license file (any of " "%s) in: %s" % (', '.join(filenames), source.get_dir())) else: src = join(source.get_dir(), license_file) shutil.copy(src, join(config.info_dir, 'license.txt')) readme = m.get_value('about/readme') if readme: src = join(source.get_dir(), readme) if not isfile(src): sys.exit("Error: no readme file: %s" % readme) dst = join(config.info_dir, readme) shutil.copy(src, dst) if os.path.split(readme)[1] not in { "README.md", "README.rst", "README" }: print( "WARNING: anaconda.org only recognizes about/readme as README.md and README.rst", file=sys.stderr) # Deal with Python 2 and 3's different json module type reqs mode_dict = {'mode': 'w', 'encoding': 'utf-8'} if PY3 else {'mode': 'wb'} with open(join(config.info_dir, 'index.json'), **mode_dict) as fo: json.dump(m.info_index(), fo, indent=2, sort_keys=True) if include_recipe: with open(join(config.info_dir, 'recipe.json'), **mode_dict) as fo: json.dump(m.meta, fo, indent=2, sort_keys=True) if sys.platform == 'win32': # make sure we use '/' path separators in metadata files = [f.replace('\\', '/') for f in files] with open(join(config.info_dir, 'files'), 'w') as fo: if m.get_value('build/noarch_python'): fo.write('\n') else: for f in files: fo.write(f + '\n') files_with_prefix = sorted(have_prefix_files(files)) binary_has_prefix_files = m.binary_has_prefix_files() text_has_prefix_files = m.has_prefix_files() if files_with_prefix and not m.get_value('build/noarch_python'): auto_detect = m.get_value('build/detect_binary_files_with_prefix') if sys.platform == 'win32': # Paths on Windows can contain spaces, so we need to quote the # paths. Fortunately they can't contain quotes, so we don't have # to worry about nested quotes. fmt_str = '"%s" %s "%s"\n' else: # Don't do it everywhere because paths on Unix can contain quotes, # and we don't have a good method of escaping, and because older # versions of conda don't support quotes in has_prefix fmt_str = '%s %s %s\n' with open(join(config.info_dir, 'has_prefix'), 'w') as fo: for pfix, mode, fn in files_with_prefix: if (fn in text_has_prefix_files): # register for text replacement, regardless of mode fo.write(fmt_str % (pfix, 'text', fn)) text_has_prefix_files.remove(fn) elif ((mode == 'binary') and (fn in binary_has_prefix_files)): print("Detected hard-coded path in binary file %s" % fn) fo.write(fmt_str % (pfix, mode, fn)) binary_has_prefix_files.remove(fn) elif (auto_detect or (mode == 'text')): print("Detected hard-coded path in %s file %s" % (mode, fn)) fo.write(fmt_str % (pfix, mode, fn)) else: print("Ignored hard-coded path in %s" % fn) # make sure we found all of the files expected errstr = "" for f in text_has_prefix_files: errstr += "Did not detect hard-coded path in %s from has_prefix_files\n" % f for f in binary_has_prefix_files: errstr += "Did not detect hard-coded path in %s from binary_has_prefix_files\n" % f if errstr: raise RuntimeError(errstr) no_link = m.get_value('build/no_link') if no_link: if not isinstance(no_link, list): no_link = [no_link] with open(join(config.info_dir, 'no_link'), 'w') as fo: for f in files: if any(fnmatch.fnmatch(f, p) for p in no_link): fo.write(f + '\n') if m.get_value('source/git_url'): with io.open(join(config.info_dir, 'git'), 'w', encoding='utf-8') as fo: source.git_info(fo) if m.get_value('app/icon'): shutil.copyfile(join(m.path, m.get_value('app/icon')), join(config.info_dir, 'icon.png'))
def create_info_files(m, files, include_recipe=True): ''' Creates the metadata files that will be stored in the built package. :param m: Package metadata :type m: Metadata :param files: Paths to files to include in package :type files: list of str :param include_recipe: Whether or not to include the recipe (True by default) :type include_recipe: bool ''' if not isdir(config.info_dir): os.makedirs(config.info_dir) if include_recipe: recipe_dir = join(config.info_dir, 'recipe') os.makedirs(recipe_dir) for fn in os.listdir(m.path): if fn.startswith('.'): continue src_path = join(m.path, fn) dst_path = join(recipe_dir, fn) if isdir(src_path): shutil.copytree(src_path, dst_path) else: shutil.copy(src_path, dst_path) # store the rendered meta.yaml file, plus information about where it came from # and what version of conda-build created it metayaml = output_yaml(m) with open(join(recipe_dir, "meta.yaml.rendered"), 'w') as f: f.write( "# This file created by conda-build {}\n".format(__version__)) f.write("# meta.yaml template originally from:\n") f.write("# " + source.get_repository_info(m.path) + "\n") f.write("# ------------------------------------------------\n\n") f.write(metayaml) license_file = m.get_value('about/license_file') if license_file: shutil.copyfile(join(source.get_dir(), license_file), join(config.info_dir, 'LICENSE.txt')) readme = m.get_value('about/readme') if readme: src = join(source.get_dir(), readme) if not isfile(src): sys.exit("Error: no readme file: %s" % readme) dst = join(config.info_dir, readme) shutil.copyfile(src, dst) if os.path.split(readme)[1] not in { "README.md", "README.rst", "README" }: print( "WARNING: anaconda.org only recognizes about/readme as README.md and README.rst", file=sys.stderr) # noqa info_index = m.info_index() pin_depends = m.get_value('build/pin_depends') if pin_depends: dists = get_run_dists(m) with open(join(config.info_dir, 'requires'), 'w') as fo: fo.write("""\ # This file as created when building: # # %s.tar.bz2 (on '%s') # # It can be used to create the runtime environment of this package using: # $ conda create --name <env> --file <this file> """ % (m.dist(), cc.subdir)) for dist in sorted(dists + [m.dist()]): fo.write('%s\n' % '='.join(dist.rsplit('-', 2))) if pin_depends == 'strict': info_index['depends'] = [ ' '.join(dist.rsplit('-', 2)) for dist in dists ] # Deal with Python 2 and 3's different json module type reqs mode_dict = {'mode': 'w', 'encoding': 'utf-8'} if PY3 else {'mode': 'wb'} with open(join(config.info_dir, 'index.json'), **mode_dict) as fo: json.dump(info_index, fo, indent=2, sort_keys=True) with open(join(config.info_dir, 'about.json'), 'w') as fo: d = {} for key in ('home', 'dev_url', 'doc_url', 'license_url', 'license', 'summary', 'description', 'license_family'): value = m.get_value('about/%s' % key) if value: d[key] = value json.dump(d, fo, indent=2, sort_keys=True) if on_win: # make sure we use '/' path separators in metadata files = [_f.replace('\\', '/') for _f in files] with open(join(config.info_dir, 'files'), **mode_dict) as fo: if m.get_value('build/noarch_python'): fo.write('\n') else: for f in files: fo.write(f + '\n') files_with_prefix = sorted(have_prefix_files(files)) binary_has_prefix_files = m.binary_has_prefix_files() text_has_prefix_files = m.has_prefix_files() ignore_files = m.ignore_prefix_files() if ignore_files: # do we have a list of files, or just ignore everything? if hasattr(ignore_files, "__iter__"): files_with_prefix = [ f for f in files_with_prefix if f[2] not in ignore_files ] binary_has_prefix_files = [ f for f in binary_has_prefix_files if f[2] not in ignore_files ] # noqa text_has_prefix_files = [ f for f in text_has_prefix_files if f[2] not in ignore_files ] else: files_with_prefix = [] if files_with_prefix and not m.get_value('build/noarch_python'): auto_detect = m.get_value('build/detect_binary_files_with_prefix') if on_win: # Paths on Windows can contain spaces, so we need to quote the # paths. Fortunately they can't contain quotes, so we don't have # to worry about nested quotes. fmt_str = '"%s" %s "%s"\n' else: # Don't do it everywhere because paths on Unix can contain quotes, # and we don't have a good method of escaping, and because older # versions of conda don't support quotes in has_prefix fmt_str = '%s %s %s\n' with open(join(config.info_dir, 'has_prefix'), 'w') as fo: for pfix, mode, fn in files_with_prefix: if (fn in text_has_prefix_files): # register for text replacement, regardless of mode fo.write(fmt_str % (pfix, 'text', fn)) text_has_prefix_files.remove(fn) elif ((mode == 'binary') and (fn in binary_has_prefix_files)): print("Detected hard-coded path in binary file %s" % fn) fo.write(fmt_str % (pfix, mode, fn)) binary_has_prefix_files.remove(fn) elif (auto_detect or (mode == 'text')): print("Detected hard-coded path in %s file %s" % (mode, fn)) fo.write(fmt_str % (pfix, mode, fn)) else: print("Ignored hard-coded path in %s" % fn) # make sure we found all of the files expected errstr = "" for f in text_has_prefix_files: errstr += "Did not detect hard-coded path in %s from has_prefix_files\n" % f for f in binary_has_prefix_files: errstr += "Did not detect hard-coded path in %s from binary_has_prefix_files\n" % f if errstr: raise RuntimeError(errstr) no_link = m.get_value('build/no_link') if no_link: if not isinstance(no_link, list): no_link = [no_link] with open(join(config.info_dir, 'no_link'), 'w') as fo: for f in files: if any(fnmatch.fnmatch(f, p) for p in no_link): fo.write(f + '\n') if m.get_value('source/git_url'): with io.open(join(config.info_dir, 'git'), 'w', encoding='utf-8') as fo: source.git_info(fo) if m.get_value('app/icon'): shutil.copyfile(join(m.path, m.get_value('app/icon')), join(config.info_dir, 'icon.png'))
def create_info_files(m, files, prefix): """ Creates the metadata files that will be stored in the built package. :param m: Package metadata :type m: Metadata :param files: Paths to files to include in package :type files: list of str """ if utils.on_win: # make sure we use '/' path separators in metadata files = [_f.replace("\\", "/") for _f in files] if m.config.filename_hashing: write_hash_input(m) write_info_json(m) # actually index.json write_about_json(m) write_link_json(m) write_run_exports(m) # TODO copy_recipe(m) copy_readme(m) copy_license(m) copy_recipe_log(m) # files.extend(jsonify_info_yamls(m)) create_all_test_files(m, test_dir=join(m.config.info_dir, "test")) if m.config.copy_test_source_files: copy_test_source_files(m, join(m.config.info_dir, "test")) write_info_files_file(m, files) files_with_prefix = get_files_with_prefix(m, [], files, prefix) record_prefix_files(m, files_with_prefix) checksums = create_info_files_json_v1(m, m.config.info_dir, prefix, files, files_with_prefix) # write_no_link(m, files) sources = m.get_section("source") if hasattr(sources, "keys"): sources = [sources] with io.open(join(m.config.info_dir, "git"), "w", encoding="utf-8") as fo: for src in sources: if src.get("git_url"): source.git_info( os.path.join(m.config.work_dir, src.get("folder", "")), build_prefix=m.config.build_prefix, verbose=m.config.verbose, fo=fo, ) if m.get_value("app/icon"): utils.copy_into( join(m.path, m.get_value("app/icon")), join(m.config.info_dir, "icon.png"), m.config.timeout, locking=m.config.locking, ) return checksums
def create_info_files(m, files, include_recipe=True): ''' Creates the metadata files that will be stored in the built package. :param m: Package metadata :type m: Metadata :param files: Paths to files to include in package :type files: list of str :param include_recipe: Whether or not to include the recipe (True by default) :type include_recipe: bool ''' recipe_dir = join(info_dir, 'recipe') os.makedirs(recipe_dir) if include_recipe: for fn in os.listdir(m.path): if fn.startswith('.'): continue src_path = join(m.path, fn) dst_path = join(recipe_dir, fn) if isdir(src_path): shutil.copytree(src_path, dst_path) else: shutil.copy(src_path, dst_path) if isfile(join(recipe_dir, 'meta.yaml')): shutil.move(join(recipe_dir, 'meta.yaml'), join(recipe_dir, 'meta.yaml.orig')) with open(join(recipe_dir, 'meta.yaml'), 'w', encoding='utf-8') as fo: yaml.safe_dump(m.meta, fo) with open(join(info_dir, 'files'), 'w', encoding='utf-8') as fo: for f in files: if sys.platform == 'win32': f = f.replace('\\', '/') fo.write(f + '\n') # Deal with Python 2 and 3's different json module type reqs mode_dict = {'mode': 'w', 'encoding': 'utf-8'} if PY3 else {'mode': 'wb'} with open(join(info_dir, 'index.json'), **mode_dict) as fo: json.dump(m.info_index(), fo, indent=2, sort_keys=True) with open(join(info_dir, 'recipe.json'), **mode_dict) as fo: json.dump(m.meta, fo, indent=2, sort_keys=True) files_with_prefix = m.has_prefix_files() for file in files_with_prefix: if file not in files: raise RuntimeError("file %s from build/has_prefix_files was " "not found" % file) if sys.platform != 'win32': files_with_prefix += list(have_prefix_files(files)) files_with_prefix = sorted(set(files_with_prefix)) if files_with_prefix: with open(join(info_dir, 'has_prefix'), 'w', encoding='utf-8') as fo: for f in files_with_prefix: fo.write(f + '\n') no_link = m.get_value('build/no_link') if no_link: def w2rx(p): return p.replace('.', r'\.').replace('*', r'.*') if not isinstance(no_link, list): no_link = [no_link] rx = '(%s)$' % '|'.join(w2rx(p) for p in no_link) pat = re.compile(rx) with open(join(info_dir, 'no_link'), 'w', encoding='utf-8') as fo: for f in files: if pat.match(f): fo.write(f + '\n') if m.get_value('source/git_url'): with open(join(info_dir, 'git'), 'w', encoding='utf-8') as fo: source.git_info(fo) if m.get_value('app/icon'): shutil.copyfile(join(m.path, m.get_value('app/icon')), join(info_dir, 'icon.png'))
def create_info_files(m, files, include_recipe=True): ''' Creates the metadata files that will be stored in the built package. :param m: Package metadata :type m: Metadata :param files: Paths to files to include in package :type files: list of str :param include_recipe: Whether or not to include the recipe (True by default) :type include_recipe: bool ''' if not isdir(config.info_dir): os.makedirs(config.info_dir) if include_recipe and m.include_recipe(): recipe_dir = join(config.info_dir, 'recipe') os.makedirs(recipe_dir) for fn in os.listdir(m.path): if fn.startswith('.'): continue src_path = join(m.path, fn) dst_path = join(recipe_dir, fn) if isdir(src_path): shutil.copytree(src_path, dst_path) else: shutil.copy(src_path, dst_path) # store the rendered meta.yaml file, plus information about where it came from # and what version of conda-build created it metayaml = output_yaml(m) with open(join(recipe_dir, "meta.yaml.rendered"), 'w') as f: f.write("# This file created by conda-build {}\n".format(__version__)) f.write("# meta.yaml template originally from:\n") f.write("# " + source.get_repository_info(m.path) + "\n") f.write("# ------------------------------------------------\n\n") f.write(metayaml) license_file = m.get_value('about/license_file') if license_file: shutil.copyfile(join(source.get_dir(), license_file), join(config.info_dir, 'LICENSE.txt')) readme = m.get_value('about/readme') if readme: src = join(source.get_dir(), readme) if not isfile(src): sys.exit("Error: no readme file: %s" % readme) dst = join(config.info_dir, readme) shutil.copyfile(src, dst) if os.path.split(readme)[1] not in {"README.md", "README.rst", "README"}: print("WARNING: anaconda.org only recognizes about/readme as README.md and README.rst", file=sys.stderr) # noqa info_index = m.info_index() pin_depends = m.get_value('build/pin_depends') if pin_depends: dists = get_run_dists(m) with open(join(config.info_dir, 'requires'), 'w') as fo: fo.write("""\ # This file as created when building: # # %s.tar.bz2 (on '%s') # # It can be used to create the runtime environment of this package using: # $ conda create --name <env> --file <this file> """ % (m.dist(), cc.subdir)) for dist in sorted(dists + [m.dist()]): fo.write('%s\n' % '='.join(dist.split('::', 1)[-1].rsplit('-', 2))) if pin_depends == 'strict': info_index['depends'] = [' '.join(dist.split('::', 1)[-1].rsplit('-', 2)) for dist in dists] # Deal with Python 2 and 3's different json module type reqs mode_dict = {'mode': 'w', 'encoding': 'utf-8'} if PY3 else {'mode': 'wb'} with open(join(config.info_dir, 'index.json'), **mode_dict) as fo: json.dump(info_index, fo, indent=2, sort_keys=True) with open(join(config.info_dir, 'about.json'), 'w') as fo: d = {} for key in ('home', 'dev_url', 'doc_url', 'license_url', 'license', 'summary', 'description', 'license_family'): value = m.get_value('about/%s' % key) if value: d[key] = value json.dump(d, fo, indent=2, sort_keys=True) if on_win: # make sure we use '/' path separators in metadata files = [_f.replace('\\', '/') for _f in files] with open(join(config.info_dir, 'files'), **mode_dict) as fo: if m.get_value('build/noarch_python'): fo.write('\n') else: for f in files: fo.write(f + '\n') files_with_prefix = sorted(have_prefix_files(files)) binary_has_prefix_files = m.binary_has_prefix_files() text_has_prefix_files = m.has_prefix_files() ignore_files = m.ignore_prefix_files() if ignore_files: # do we have a list of files, or just ignore everything? if hasattr(ignore_files, "__iter__"): files_with_prefix = [f for f in files_with_prefix if f[2] not in ignore_files] binary_has_prefix_files = [f for f in binary_has_prefix_files if f[2] not in ignore_files] # noqa text_has_prefix_files = [f for f in text_has_prefix_files if f[2] not in ignore_files] else: files_with_prefix = [] if files_with_prefix and not m.get_value('build/noarch_python'): auto_detect = m.get_value('build/detect_binary_files_with_prefix') if on_win: # Paths on Windows can contain spaces, so we need to quote the # paths. Fortunately they can't contain quotes, so we don't have # to worry about nested quotes. fmt_str = '"%s" %s "%s"\n' else: # Don't do it everywhere because paths on Unix can contain quotes, # and we don't have a good method of escaping, and because older # versions of conda don't support quotes in has_prefix fmt_str = '%s %s %s\n' with open(join(config.info_dir, 'has_prefix'), 'w') as fo: for pfix, mode, fn in files_with_prefix: if (fn in text_has_prefix_files): # register for text replacement, regardless of mode fo.write(fmt_str % (pfix, 'text', fn)) text_has_prefix_files.remove(fn) elif ((mode == 'binary') and (fn in binary_has_prefix_files)): print("Detected hard-coded path in binary file %s" % fn) fo.write(fmt_str % (pfix, mode, fn)) binary_has_prefix_files.remove(fn) elif (auto_detect or (mode == 'text')): print("Detected hard-coded path in %s file %s" % (mode, fn)) fo.write(fmt_str % (pfix, mode, fn)) else: print("Ignored hard-coded path in %s" % fn) # make sure we found all of the files expected errstr = "" for f in text_has_prefix_files: errstr += "Did not detect hard-coded path in %s from has_prefix_files\n" % f for f in binary_has_prefix_files: errstr += "Did not detect hard-coded path in %s from binary_has_prefix_files\n" % f if errstr: raise RuntimeError(errstr) no_link = m.get_value('build/no_link') if no_link: if not isinstance(no_link, list): no_link = [no_link] with open(join(config.info_dir, 'no_link'), 'w') as fo: for f in files: if any(fnmatch.fnmatch(f, p) for p in no_link): fo.write(f + '\n') if m.get_value('source/git_url'): with io.open(join(config.info_dir, 'git'), 'w', encoding='utf-8') as fo: source.git_info(fo) if m.get_value('app/icon'): shutil.copyfile(join(m.path, m.get_value('app/icon')), join(config.info_dir, 'icon.png'))
def create_info_files(m, files, include_recipe=True): ''' Creates the metadata files that will be stored in the built package. :param m: Package metadata :type m: Metadata :param files: Paths to files to include in package :type files: list of str :param include_recipe: Whether or not to include the recipe (True by default) :type include_recipe: bool ''' recipe_dir = join(config.info_dir, 'recipe') os.makedirs(recipe_dir) if include_recipe: for fn in os.listdir(m.path): if fn.startswith('.'): continue src_path = join(m.path, fn) dst_path = join(recipe_dir, fn) if isdir(src_path): shutil.copytree(src_path, dst_path) else: shutil.copy(src_path, dst_path) if isfile(join(recipe_dir, 'meta.yaml')): shutil.move(join(recipe_dir, 'meta.yaml'), join(recipe_dir, 'meta.yaml.orig')) with open(join(recipe_dir, 'meta.yaml'), 'w') as fo: yaml.safe_dump(m.meta, fo) if sys.platform == 'win32': for i, f in enumerate(files): files[i] = f.replace('\\', '/') with open(join(config.info_dir, 'files'), 'w') as fo: for f in files: fo.write(f + '\n') # Deal with Python 2 and 3's different json module type reqs mode_dict = {'mode': 'w', 'encoding': 'utf-8'} if PY3 else {'mode': 'wb'} with open(join(config.info_dir, 'index.json'), **mode_dict) as fo: json.dump(m.info_index(), fo, indent=2, sort_keys=True) with open(join(config.info_dir, 'recipe.json'), **mode_dict) as fo: json.dump(m.meta, fo, indent=2, sort_keys=True) files_with_prefix = m.has_prefix_files() binary_files_with_prefix_patterns = m.binary_has_prefix_files() binary_files_with_prefix = [ filename for pattern in binary_files_with_prefix_patterns for filename in fnmatch.filter(files, pattern) ] for file in files_with_prefix: if file not in files: raise RuntimeError("file %s from build/has_prefix_files was " "not found" % file) for file in binary_files_with_prefix: if file not in files: raise RuntimeError("file %s from build/has_prefix_files was " "not found" % file) if sys.platform == 'win32': # Paths on Windows can contain spaces, so we need to quote the # paths. Fortunately they can't contain quotes, so we don't have # to worry about nested quotes. fmt_str = '"%s" %s "%s"' else: # Don't do it everywhere because paths on Unix can contain quotes, # and we don't have a good method of escaping, and because older # versions of conda don't support quotes in has_prefix fmt_str = '%s %s %s' prefix = config.build_prefix with open(os.path.join(prefix, file), 'rb') as f: data = f.read() if prefix.encode('utf-8') in data: files_with_prefix.append(fmt_str % (prefix, 'binary', file)) elif sys.platform == 'win32': # some windows libraries encode prefix with unix path separators alt_p = prefix.replace('\\', '/') if alt_p.encode('utf-8') in data: files_with_prefix.append(fmt_str % (alt_p, 'binary', file)) else: print('Warning: prefix %s not found in %s' % (prefix, file)) else: print('Warning: prefix %s not found in %s' % (prefix, file)) files_with_prefix += list(have_prefix_files(files)) files_with_prefix = sorted(set(files_with_prefix)) if files_with_prefix: with open(join(config.info_dir, 'has_prefix'), 'w') as fo: for f in files_with_prefix: fo.write(f + '\n') no_link = m.get_value('build/no_link') if no_link: def w2rx(p): return p.replace('.', r'\.').replace('*', r'.*') if not isinstance(no_link, list): no_link = [no_link] rx = '(%s)$' % '|'.join(w2rx(p) for p in no_link) pat = re.compile(rx) with open(join(config.info_dir, 'no_link'), 'w') as fo: for f in files: if pat.match(f): fo.write(f + '\n') if m.get_value('source/git_url'): with open(join(config.info_dir, 'git'), 'w') as fo: source.git_info(fo) if m.get_value('app/icon'): shutil.copyfile(join(m.path, m.get_value('app/icon')), join(config.info_dir, 'icon.png'))
def create_info_files(m, files, include_recipe=True): ''' Creates the metadata files that will be stored in the built package. :param m: Package metadata :type m: Metadata :param files: Paths to files to include in package :type files: list of str :param include_recipe: Whether or not to include the recipe (True by default) :type include_recipe: bool ''' recipe_dir = join(config.info_dir, 'recipe') os.makedirs(recipe_dir) if include_recipe: for fn in os.listdir(m.path): if fn.startswith('.'): continue src_path = join(m.path, fn) dst_path = join(recipe_dir, fn) if isdir(src_path): shutil.copytree(src_path, dst_path) else: shutil.copy(src_path, dst_path) if isfile(join(recipe_dir, 'meta.yaml')): shutil.move(join(recipe_dir, 'meta.yaml'), join(recipe_dir, 'meta.yaml.orig')) with open(join(recipe_dir, 'meta.yaml'), 'w') as fo: yaml.safe_dump(m.meta, fo) if sys.platform == 'win32': for i, f in enumerate(files): files[i] = f.replace('\\', '/') with open(join(config.info_dir, 'files'), 'w') as fo: for f in files: fo.write(f + '\n') # Deal with Python 2 and 3's different json module type reqs mode_dict = {'mode': 'w', 'encoding': 'utf-8'} if PY3 else {'mode': 'wb'} with open(join(config.info_dir, 'index.json'), **mode_dict) as fo: json.dump(m.info_index(), fo, indent=2, sort_keys=True) with open(join(config.info_dir, 'recipe.json'), **mode_dict) as fo: json.dump(m.meta, fo, indent=2, sort_keys=True) files_with_prefix = m.has_prefix_files() binary_files_with_prefix = m.binary_has_prefix_files() for file in files_with_prefix: if file not in files: raise RuntimeError("file %s from build/has_prefix_files was " "not found" % file) for file in binary_files_with_prefix: if file not in files: raise RuntimeError("file %s from build/has_prefix_files was " "not found" % file) if sys.platform == 'win32': # Paths on Windows can contain spaces, so we need to quote the # paths. Fortunately they can't contain quotes, so we don't have # to worry about nested quotes. fmt_str = '"%s" %s "%s"' else: # Don't do it everywhere because paths on Unix can contain quotes, # and we don't have a good method of escaping, and because older # versions of conda don't support quotes in has_prefix fmt_str = '%s %s %s' prefix = config.build_prefix with open(os.path.join(prefix, file), 'rb') as f: data = f.read() if prefix.encode('utf-8') in data: files_with_prefix.append(fmt_str % (prefix, 'binary', file)) elif sys.platform == 'win32': # some windows libraries encode prefix with unix path separators alt_p = prefix.replace('\\', '/') if alt_p.encode('utf-8') in data: files_with_prefix.append(fmt_str % (alt_p, 'binary', file)) else: print('Warning: prefix %s not found in %s' % (prefix, file)) else: print('Warning: prefix %s not found in %s' % (prefix, file)) files_with_prefix += list(have_prefix_files(files)) files_with_prefix = sorted(set(files_with_prefix)) if files_with_prefix: with open(join(config.info_dir, 'has_prefix'), 'w') as fo: for f in files_with_prefix: fo.write(f + '\n') no_link = m.get_value('build/no_link') if no_link: def w2rx(p): return p.replace('.', r'\.').replace('*', r'.*') if not isinstance(no_link, list): no_link = [no_link] rx = '(%s)$' % '|'.join(w2rx(p) for p in no_link) pat = re.compile(rx) with open(join(config.info_dir, 'no_link'), 'w') as fo: for f in files: if pat.match(f): fo.write(f + '\n') if m.get_value('source/git_url'): with open(join(config.info_dir, 'git'), 'w') as fo: source.git_info(fo) if m.get_value('app/icon'): shutil.copyfile(join(m.path, m.get_value('app/icon')), join(config.info_dir, 'icon.png'))
def create_info_files(m, files, include_recipe=True): """ Creates the metadata files that will be stored in the built package. :param m: Package metadata :type m: Metadata :param files: Paths to files to include in package :type files: list of str :param include_recipe: Whether or not to include the recipe (True by default) :type include_recipe: bool """ if not isdir(config.info_dir): os.makedirs(config.info_dir) if include_recipe: recipe_dir = join(config.info_dir, "recipe") os.makedirs(recipe_dir) for fn in os.listdir(m.path): if fn.startswith("."): continue src_path = join(m.path, fn) dst_path = join(recipe_dir, fn) if isdir(src_path): shutil.copytree(src_path, dst_path) else: shutil.copy(src_path, dst_path) license_file = m.get_value("about/license_file") if license_file: filenames = "LICENSE", "LICENSE.txt", "license", "license.txt" if license_file is True: for fn in filenames: src = join(source.get_dir(), fn) if isfile(src): break else: sys.exit( "Error: could not locate license file (any of " "%s) in: %s" % (comma_join(filenames), source.get_dir()) ) else: src = join(source.get_dir(), license_file) shutil.copy(src, join(config.info_dir, "license.txt")) readme = m.get_value("about/readme") if readme: src = join(source.get_dir(), readme) if not isfile(src): sys.exit("Error: no readme file: %s" % readme) dst = join(config.info_dir, readme) shutil.copy(src, dst) if os.path.split(readme)[1] not in {"README.md", "README.rst", "README"}: print("WARNING: anaconda.org only recognizes about/readme as README.md and README.rst", file=sys.stderr) # Deal with Python 2 and 3's different json module type reqs mode_dict = {"mode": "w", "encoding": "utf-8"} if PY3 else {"mode": "wb"} with open(join(config.info_dir, "index.json"), **mode_dict) as fo: json.dump(m.info_index(), fo, indent=2, sort_keys=True) if include_recipe: with open(join(config.info_dir, "recipe.json"), **mode_dict) as fo: json.dump(m.meta, fo, indent=2, sort_keys=True) if sys.platform == "win32": # make sure we use '/' path separators in metadata files = [f.replace("\\", "/") for f in files] with open(join(config.info_dir, "files"), "w") as fo: if m.get_value("build/noarch_python"): fo.write("\n") else: for f in files: fo.write(f + "\n") files_with_prefix = sorted(have_prefix_files(files)) binary_has_prefix_files = m.binary_has_prefix_files() text_has_prefix_files = m.has_prefix_files() if files_with_prefix and not m.get_value("build/noarch_python"): auto_detect = m.get_value("build/detect_binary_files_with_prefix") if sys.platform == "win32": # Paths on Windows can contain spaces, so we need to quote the # paths. Fortunately they can't contain quotes, so we don't have # to worry about nested quotes. fmt_str = '"%s" %s "%s"\n' else: # Don't do it everywhere because paths on Unix can contain quotes, # and we don't have a good method of escaping, and because older # versions of conda don't support quotes in has_prefix fmt_str = "%s %s %s\n" with open(join(config.info_dir, "has_prefix"), "w") as fo: for pfix, mode, fn in files_with_prefix: if fn in text_has_prefix_files: # register for text replacement, regardless of mode fo.write(fmt_str % (pfix, "text", fn)) text_has_prefix_files.remove(fn) elif (mode == "binary") and (fn in binary_has_prefix_files): print("Detected hard-coded path in binary file %s" % fn) fo.write(fmt_str % (pfix, mode, fn)) binary_has_prefix_files.remove(fn) elif auto_detect or (mode == "text"): print("Detected hard-coded path in %s file %s" % (mode, fn)) fo.write(fmt_str % (pfix, mode, fn)) else: print("Ignored hard-coded path in %s" % fn) # make sure we found all of the files expected errstr = "" for f in text_has_prefix_files: errstr += "Did not detect hard-coded path in %s from has_prefix_files\n" % f for f in binary_has_prefix_files: errstr += "Did not detect hard-coded path in %s from binary_has_prefix_files\n" % f if errstr: raise RuntimeError(errstr) no_link = m.get_value("build/no_link") if no_link: if not isinstance(no_link, list): no_link = [no_link] with open(join(config.info_dir, "no_link"), "w") as fo: for f in files: if any(fnmatch.fnmatch(f, p) for p in no_link): fo.write(f + "\n") if m.get_value("source/git_url"): with io.open(join(config.info_dir, "git"), "w", encoding="utf-8") as fo: source.git_info(fo) if m.get_value("app/icon"): shutil.copyfile(join(m.path, m.get_value("app/icon")), join(config.info_dir, "icon.png"))