def pack(directory, output=None): mksquashfs_path = file_utils.get_tool_path('mksquashfs') # Check for our prerequesite external command early repo.check_for_command(mksquashfs_path) snap = _snap_data_from_dir(directory) output_snap_name = output or common.format_snap_name(snap) # If a .snap-build exists at this point, when we are about to override # the snap blob, it is stale. We rename it so user have a chance to # recover accidentally lost assertions. snap_build = output_snap_name + '-build' if os.path.isfile(snap_build): _new = '{}.{}'.format(snap_build, int(time.time())) logger.warning('Renaming stale build assertion to {}'.format(_new)) os.rename(snap_build, _new) _run_mksquashfs(mksquashfs_path, directory=directory, snap_name=snap['name'], snap_type=snap['type'], output_snap_name=output_snap_name) return output_snap_name
def pack(directory, output=None): mksquashfs_path = file_utils.get_tool_path("mksquashfs") # Check for our prerequesite external command early repo.check_for_command(mksquashfs_path) snap = _snap_data_from_dir(directory) output_snap_name = output or common.format_snap_name(snap) # If a .snap-build exists at this point, when we are about to override # the snap blob, it is stale. We rename it so user have a chance to # recover accidentally lost assertions. snap_build = output_snap_name + "-build" if os.path.isfile(snap_build): _new = "{}.{}".format(snap_build, int(time.time())) logger.warning("Renaming stale build assertion to {}".format(_new)) os.rename(snap_build, _new) _run_mksquashfs( mksquashfs_path, directory=directory, snap_name=snap["name"], snap_type=snap["type"], output_snap_name=output_snap_name, ) return output_snap_name
def _process_entry(data): parts_list = OrderedDict() # Store all the parts listed in 'after' for each included part so that # we can check later that we aren't missing any parts. # XXX: What do we do about 'after' parts that should be looked for in # the wiki? They should be in the master parts list. after_parts = set() # Get optional wiki entry fields. origin_type = data.get('origin-type') origin_branch = data.get('origin-branch') origin_commit = data.get('origin-commit') origin_tag = data.get('origin-tag') # Get required wiki entry fields. try: entry_parts = data['parts'] origin = data['origin'] maintainer = data['maintainer'] description = data['description'] except KeyError as e: raise errors.InvalidWikiEntryError( 'Missing key in wiki entry: {}'.format(e)) logger.info('Processing origin {origin!r}'.format(origin=origin)) origin_dir = os.path.join(_get_base_dir(), _encode_origin(origin)) os.makedirs(origin_dir, exist_ok=True) source_handler = sources.get_source_handler(origin, source_type=origin_type) handler = source_handler(origin, source_dir=origin_dir) repo.check_for_command(handler.command) handler.source_branch = origin_branch handler.source_commit = origin_commit handler.source_tag = origin_tag handler.pull() try: origin_data = _get_origin_data(origin_dir) except project_loader.errors.MissingSnapcraftYamlError as e: raise errors.InvalidWikiEntryError( 'Origin {origin!r} is missing a snapcraft.yaml file.'.format( origin=origin)) from e except errors.SnapcraftEnvironmentError as e: raise errors.InvalidWikiEntryError( 'snapcraft.yaml error: {}'.format(e)) from e origin_parts = origin_data.get('parts', {}) origin_name = origin_data.get('name') origin_version = origin_data.get('version') entry_parts_list, entry_parts_after_list = _process_entry_parts( entry_parts, origin_parts, origin, maintainer, description, origin_name, origin_version, ) parts_list.update(entry_parts_list) after_parts.update(entry_parts_after_list) return parts_list, after_parts
def _process_entry(data): parts_list = OrderedDict() # Store all the parts listed in 'after' for each included part so that # we can check later that we aren't missing any parts. # XXX: What do we do about 'after' parts that should be looked for in # the wiki? They should be in the master parts list. after_parts = set() # Get optional wiki entry fields. origin_type = data.get('origin-type') origin_branch = data.get('origin-branch') origin_commit = data.get('origin-commit') origin_tag = data.get('origin-tag') # Get required wiki entry fields. try: entry_parts = data['parts'] origin = data['origin'] maintainer = data['maintainer'] description = data['description'] except KeyError as e: raise errors.InvalidWikiEntryError( 'Missing key in wiki entry: {}'.format(e)) logger.info('Processing origin {origin!r}'.format(origin=origin)) origin_dir = os.path.join(_get_base_dir(), _encode_origin(origin)) os.makedirs(origin_dir, exist_ok=True) source_handler = sources.get_source_handler(origin, source_type=origin_type) handler = source_handler(origin, source_dir=origin_dir) repo.check_for_command(handler.command) handler.source_branch = origin_branch handler.source_commit = origin_commit handler.source_tag = origin_tag handler.pull() try: origin_data = _get_origin_data(origin_dir) except MissingSnapcraftYAMLError: raise errors.InvalidWikiEntryError( 'Origin {origin!r} is missing a snapcraft.yaml file.'.format( origin=origin)) except BadSnapcraftYAMLError as e: raise errors.InvalidWikiEntryError( 'snapcraft.yaml error: {}'.format(e)) origin_parts = origin_data.get('parts', {}) origin_name = origin_data.get('name') origin_version = origin_data.get('version') entry_parts_list, entry_parts_after_list = _process_entry_parts( entry_parts, origin_parts, origin, maintainer, description, origin_name, origin_version, ) parts_list.update(entry_parts_list) after_parts.update(entry_parts_after_list) return parts_list, after_parts
def pack(directory, output=None): # Check for our prerequesite external command early repo.check_for_command('mksquashfs') snap = _snap_data_from_dir(directory) snap_name = output or common.format_snap_name(snap) # If a .snap-build exists at this point, when we are about to override # the snap blob, it is stale. We rename it so user have a chance to # recover accidentally lost assertions. snap_build = snap_name + '-build' if os.path.isfile(snap_build): _new = '{}.{}'.format(snap_build, int(time.time())) logger.warning('Renaming stale build assertion to {}'.format(_new)) os.rename(snap_build, _new) # These options need to match the review tools: # http://bazaar.launchpad.net/~click-reviewers/click-reviewers-tools/trunk/view/head:/clickreviews/common.py#L38 mksquashfs_args = [ '-noappend', '-comp', 'xz', '-no-xattrs', '-no-fragments' ] if snap['type'] != 'os': mksquashfs_args.append('-all-root') with Popen(['mksquashfs', directory, snap_name] + mksquashfs_args, stdout=PIPE, stderr=STDOUT) as proc: ret = None if is_dumb_terminal(): logger.info('Snapping {!r} ...'.format(snap['name'])) ret = proc.wait() else: message = '\033[0;32m\rSnapping {!r}\033[0;32m '.format( snap['name']) progress_indicator = ProgressBar( widgets=[message, AnimatedMarker()], maxval=7) progress_indicator.start() ret = proc.poll() count = 0 while ret is None: if count >= 7: progress_indicator.start() count = 0 progress_indicator.update(count) count += 1 time.sleep(.2) ret = proc.poll() print('') if ret != 0: logger.error(proc.stdout.read().decode('utf-8')) raise RuntimeError('Failed to create snap {!r}'.format(snap_name)) logger.debug(proc.stdout.read().decode('utf-8')) return snap_name
def pack(directory, output=None): # Check for our prerequesite external command early repo.check_for_command('mksquashfs') snap = _snap_data_from_dir(directory) snap_name = output or common.format_snap_name(snap) # If a .snap-build exists at this point, when we are about to override # the snap blob, it is stale. We rename it so user have a chance to # recover accidentally lost assertions. snap_build = snap_name + '-build' if os.path.isfile(snap_build): _new = '{}.{}'.format(snap_build, int(time.time())) logger.warning('Renaming stale build assertion to {}'.format(_new)) os.rename(snap_build, _new) # These options need to match the review tools: # http://bazaar.launchpad.net/~click-reviewers/click-reviewers-tools/trunk/view/head:/clickreviews/common.py#L38 mksquashfs_args = ['-noappend', '-comp', 'xz', '-no-xattrs'] if snap['type'] != 'os': mksquashfs_args.append('-all-root') with Popen(['mksquashfs', directory, snap_name] + mksquashfs_args, stdout=PIPE, stderr=STDOUT) as proc: ret = None if is_dumb_terminal(): logger.info('Snapping {!r} ...'.format(snap['name'])) ret = proc.wait() else: message = '\033[0;32m\rSnapping {!r}\033[0;32m '.format( snap['name']) progress_indicator = ProgressBar( widgets=[message, AnimatedMarker()], maxval=7) progress_indicator.start() ret = proc.poll() count = 0 while ret is None: if count >= 7: progress_indicator.start() count = 0 progress_indicator.update(count) count += 1 time.sleep(.2) ret = proc.poll() print('') if ret != 0: logger.error(proc.stdout.read().decode('utf-8')) raise RuntimeError('Failed to create snap {!r}'.format(snap_name)) logger.debug(proc.stdout.read().decode('utf-8')) return snap_name
def test_check_for_command_installed(self): check_for_command('sh')
def _process_entry(data): parts_list = OrderedDict() # Store all the parts listed in 'after' for each included part so that # we can check later that we aren't missing any parts. # XXX: What do we do about 'after' parts that should be looked for in # the wiki? They should be in the master parts list. after_parts = set() # Get optional wiki entry fields. origin_type = data.get("origin-type") origin_branch = data.get("origin-branch") origin_commit = data.get("origin-commit") origin_tag = data.get("origin-tag") # Get required wiki entry fields. try: entry_parts = data["parts"] origin = data["origin"] maintainer = data["maintainer"] description = data["description"] except KeyError as e: raise errors.InvalidWikiEntryError( "Missing key in wiki entry: {}".format(e)) logger.info("Processing origin {origin!r}".format(origin=origin)) origin_dir = os.path.join(_get_base_dir(), _encode_origin(origin)) os.makedirs(origin_dir, exist_ok=True) source_handler = sources.get_source_handler(origin, source_type=origin_type) handler = source_handler(origin, source_dir=origin_dir) repo.check_for_command(handler.command) handler.source_branch = origin_branch handler.source_commit = origin_commit handler.source_tag = origin_tag handler.pull() try: origin_data = _get_origin_data(origin_dir) except project.errors.MissingSnapcraftYamlError as e: raise errors.InvalidWikiEntryError( "Origin {origin!r} is missing a snapcraft.yaml file.".format( origin=origin)) from e except errors.SnapcraftEnvironmentError as e: raise errors.InvalidWikiEntryError( "snapcraft.yaml error: {}".format(e)) from e origin_parts = origin_data.get("parts", {}) origin_name = origin_data.get("name") origin_version = origin_data.get("version") entry_parts_list, entry_parts_after_list = _process_entry_parts( entry_parts, origin_parts, origin, maintainer, description, origin_name, origin_version, ) parts_list.update(entry_parts_list) after_parts.update(entry_parts_after_list) return parts_list, after_parts
def test_check_for_command_installed(self): check_for_command('sh')