def init(): be, err = stamp_utils.get_client(CWD) if err: LOGGER.error('{0}. Exiting'.format(err)) return if os.path.isdir('{0}/.vmn'.format(be.root())): LOGGER.info('vmn tracking is already initialized') return err = be.check_for_pending_changes() if err: LOGGER.info('{0}. Exiting'.format(err)) return err = be.check_for_outgoing_changes() if err: LOGGER.info('{0}. Exiting'.format(err)) return changeset = be.changeset() vmn_path = '{0}/.vmn/'.format(be.root()) Path(vmn_path).mkdir(parents=True, exist_ok=True) vmn_unique_path = '{0}/{1}'.format(vmn_path, changeset) Path(vmn_unique_path).touch() be.commit(message='Initialized vmn tracking', user='******', include=[vmn_path, vmn_unique_path]) be.push()
def _pull_repo(args): path, rel_path, changeset = args client = None try: client, err = stamp_utils.get_client(path) if client is None: return {'repo': rel_path, 'status': 0, 'description': err} except Exception as exc: LOGGER.exception( 'PLEASE FIX!\nAborting pull operation because directory {0} ' 'Reason:\n{1}\n'.format(path, exc)) return {'repo': rel_path, 'status': 1, 'description': None} try: err = client.check_for_pending_changes() if err: LOGGER.info('{0}. Aborting pull operation '.format(err)) return {'repo': rel_path, 'status': 1, 'description': err} except Exception as exc: LOGGER.exception('Skipping "{0}" directory reason:\n{1}\n'.format( path, exc)) return {'repo': rel_path, 'status': 0, 'description': None} try: err = client.check_for_outgoing_changes() if err: LOGGER.info('{0}. Aborting pull operation'.format(err)) return {'repo': rel_path, 'status': 1, 'description': err} LOGGER.info('Pulling from {0}'.format(rel_path)) if changeset is None: client.pull() rev = client.checkout_branch() LOGGER.info('Updated {0} to {1}'.format(rel_path, rev)) else: cur_changeset = client.changeset() client.pull() client.checkout(rev=changeset) LOGGER.info('Updated {0} to {1}'.format(rel_path, changeset)) except Exception as exc: LOGGER.exception( 'PLEASE FIX!\nAborting pull operation because directory {0} ' 'Reason:\n{1}\n'.format(path, exc)) try: client.checkout(rev=cur_changeset) except Exception: LOGGER.exception('PLEASE FIX!') return {'repo': rel_path, 'status': 1, 'description': None} return {'repo': rel_path, 'status': 0, 'description': None}
def goto_version(params, version): be, err = stamp_utils.get_client(params['working_dir']) if err: LOGGER.error('{0}. Exiting'.format(err)) return err if not os.path.isdir('{0}/.vmn'.format(params['root_path'])): LOGGER.info('vmn tracking is not yet initialized') return err err = be.check_for_pending_changes() if err: LOGGER.info('{0}. Exiting'.format(err)) return err err = be.check_for_outgoing_changes() if err: LOGGER.info('{0}. Exiting'.format(err)) return err if not os.path.isfile(params['app_path']): LOGGER.error('No such app: {0}'.format(params['name'])) return 1 if version is None: with open(params['app_path'], 'r') as f: data = yaml.safe_load(f) deps = data["changesets"] deps.pop('.') if deps: for rel_path, v in deps.items(): v['hash'] = None _goto_version(deps, params['root_path']) else: be.checkout_branch() return 0 tag_name = params['name'].replace('/', '-') tag_name = '{0}_{1}'.format(tag_name, version) try: be.checkout(tag=tag_name) except Exception: LOGGER.error('App: {0} with version: {1} was ' 'not found'.format(params['name'], version)) return 1 with open(params['app_path'], 'r') as f: data = yaml.safe_load(f) deps = data["changesets"] deps.pop('.') if deps: _goto_version(deps, params['root_path']) return None
def stamp(params): be, err = stamp_utils.get_client(params['working_dir']) if err: LOGGER.error('{0}. Exiting'.format(err)) return err if not os.path.isdir('{0}/.vmn'.format(params['root_path'])): LOGGER.info('vmn tracking is not yet initialized') return err err = be.check_for_pending_changes() if err: LOGGER.info('{0}. Exiting'.format(err)) return err err = be.check_for_outgoing_changes() if err: LOGGER.info('{0}. Exiting'.format(err)) return err lock = LockFile(os.path.join(params['root_path'], 'vmn.lock')) with lock: LOGGER.info('Locked: {0}'.format(lock.path)) be = VersionControlStamper(params) be.allocate_backend() try: version = get_version(be, params) except Exception: LOGGER.exception('Logged Exception message:') be.deallocate_backend() return 1 LOGGER.info(version) be.deallocate_backend() LOGGER.info('Released locked: {0}'.format(lock.path)) return None
def goto_version(params, version): be, err = stamp_utils.get_client(CWD) if err: LOGGER.error('{0}. Exiting'.format(err)) return if not os.path.isdir('{0}/.vmn'.format(be.root())): LOGGER.info('vmn tracking is not yet initialized') return err = be.check_for_pending_changes() if err: LOGGER.info('{0}. Exiting'.format(err)) return err = be.check_for_outgoing_changes() if err: LOGGER.info('{0}. Exiting'.format(err)) return if not os.path.isfile(params['app_path']): LOGGER.error('No such app: {0}'.format(params['name'])) return 1 if version is None: with open(params['app_path']) as f: data = yaml.safe_load(f) deps = data["changesets"] _goto_version(deps, params['root_path']) else: with open(params['app_index_path'], 'r') as f: data = yaml.safe_load(f) if version not in data: LOGGER.error('App: {0} with version: {1} was ' 'not found'.format(params['name'], version)) return 1 deps = data[version]["changesets"] _goto_version(deps, params['root_path']) return 0 return 1
def show(name): be, err = stamp_utils.get_client(CWD) if err: LOGGER.error('{0}. Exiting'.format(err)) return if not os.path.isdir('{0}/.vmn'.format(be.root())): LOGGER.error('vmn tracking is not yet initialized') return root_path = os.path.join(be.root()) app_path = os.path.join(root_path, '.vmn', name, 'ver.yml') if not os.path.isfile(app_path): LOGGER.error('No ver.yml file under {0}'.format(name)) return with open(app_path) as f: data = yaml.safe_load(f) print(data['version'])
def show(params): be, err = stamp_utils.get_client(params['working_dir']) if err: LOGGER.error('{0}. Exiting'.format(err)) return err if not os.path.isdir('{0}/.vmn'.format(params['root_path'])): LOGGER.error('vmn tracking is not yet initialized') return err app_path = params['app_path'] if not os.path.isfile(app_path): LOGGER.error('No ver.yml file under {0}'.format(params['name'])) return err with open(app_path) as f: data = yaml.safe_load(f) print(data['version']) return None
def stamp(params): be, err = stamp_utils.get_client(CWD) if err: LOGGER.error('{0}. Exiting'.format(err)) return if not os.path.isdir('{0}/.vmn'.format(be.root())): LOGGER.info('vmn tracking is not yet initialized') return err = be.check_for_pending_changes() if err: LOGGER.info('{0}. Exiting'.format(err)) return err = be.check_for_outgoing_changes() if err: LOGGER.info('{0}. Exiting'.format(err)) return lock = LockFile(os.path.join(params['root_path'], 'vmn.lock')) with lock: LOGGER.info('Locked: {0}'.format(lock.path)) be = VersionControlStamper(params) be.allocate_backend() version = get_version(be, params) LOGGER.info(version) be.deallocate_backend() LOGGER.info('Released locked: {0}'.format(lock.path)) return 0
def build_world(name, working_dir): params = { 'name': name, 'working_dir': working_dir, } be, err = stamp_utils.get_client(params['working_dir']) if err: LOGGER.error('{0}. Exiting'.format(err)) return None root_path = os.path.join(be.root()) params['root_path'] = root_path if name is None: return params app_path = os.path.join(root_path, '.vmn', params['name'], 'ver.yml') app_conf_path = os.path.join(root_path, '.vmn', params['name'], 'conf.yml') hist_path = os.path.join(root_path, '.vmn', params['name'], '_index.yml') params['app_path'] = app_path params['app_conf_path'] = app_conf_path app_dir = os.path.dirname(params['app_path']) params['app_index_path'] = os.path.join(app_dir, '_index.yml') params['hist_path'] = hist_path params['repo_name'] = os.path.basename(root_path) root_app_name = params['name'].split('/') if len(root_app_name) == 1: root_app_name = None else: root_app_name = '/'.join(root_app_name[:-1]) root_app_path = None root_hist_path = None if root_app_name is not None: root_app_path = os.path.join(root_path, '.vmn', root_app_name, 'root_ver.yml') root_hist_path = os.path.join(root_path, '.vmn', root_app_name, '_root_index.yml') params['root_app_name'] = root_app_name params['root_app_path'] = root_app_path params['root_hist_path'] = root_hist_path default_repos_path = os.path.join(root_path, '../') user_repos_details = HostState.get_user_repo_details( {default_repos_path: os.listdir(default_repos_path)}, root_path) params['version_template'] = '{0}.{1}.{2}' params["extra_info"] = False params['user_repos_details'] = user_repos_details if not os.path.isfile(app_path): return params with open(app_conf_path, 'r') as f: data = yaml.safe_load(f) params['version_template'] = data["conf"]["template"] params["extra_info"] = data["conf"]["extra_info"] deps = {} for rel_path, dep in data["conf"]["deps"].items(): deps[os.path.join(root_path, rel_path)] = tuple(dep.keys()) user_repos_details.update( HostState.get_user_repo_details(deps, root_path)) params['user_repos_details'] = user_repos_details return params
def allocate_backend(self): self._backend, _ = stamp_utils.get_client(self._root_path)
def _build_world(params): if 'name' not in params: return params['name'] = os.path.split(params['name']) params['name'] = os.path.join(*params['name']) be, err = stamp_utils.get_client(CWD) if err: LOGGER.error('{0}. Exiting'.format(err)) return root_path = os.path.join(be.root()) app_path = os.path.join(root_path, '.vmn', params['name'], 'ver.yml') hist_path = os.path.join(root_path, '.vmn', params['name'], '_index.yml') params['root_path'] = root_path params['app_path'] = app_path app_dir = os.path.dirname(params['app_path']) params['app_index_path'] = os.path.join(app_dir, '_index.yml') params['hist_path'] = hist_path params['repo_name'] = os.path.basename(root_path) root_app_name = params['name'].split('/') if len(root_app_name) == 1: root_app_name = None else: root_app_name = '/'.join(root_app_name[:-1]) root_app_path = None root_hist_path = None if root_app_name is not None: root_app_path = os.path.join(root_path, '.vmn', root_app_name, 'root_ver.yml') root_hist_path = os.path.join(root_path, '.vmn', root_app_name, '_root_index.yml') params['root_app_name'] = root_app_name params['root_app_path'] = root_app_path params['root_hist_path'] = root_hist_path default_repos_path = os.path.join(root_path, '../') changesets = HostState.get_current_changeset( {default_repos_path: os.listdir(default_repos_path)}, root_path) params['version_template'] = '{0}.{1}.{2}' params['root_version_template'] = '{0}.{1}.{2}' params["extra_info"] = False params['changesets'] = changesets if not os.path.isfile(app_path): return with open(app_path, 'r') as f: data = yaml.safe_load(f) params['version_template'] = data["conf"]["template"] params["extra_info"] = data["conf"]["extra_info"] params['root_version_template'] = None if root_app_path is not None and os.path.isfile(root_app_path): with open(root_app_path) as root_f: root_data = yaml.safe_load(root_f) params['root_version_template'] = root_data["conf"]["template"] deps = {} for rel_path, dep in data["conf"]["deps"].items(): deps[os.path.join(root_path, rel_path)] = tuple(dep.keys()) changesets = HostState.get_current_changeset(deps, root_path) params['changesets'] = changesets