コード例 #1
0
ファイル: vmn.py プロジェクト: bitton-yehonatan/ver_stamp
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()
コード例 #2
0
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}
コード例 #3
0
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
コード例 #4
0
ファイル: vmn.py プロジェクト: bigtrav45/vmn
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
コード例 #5
0
ファイル: vmn.py プロジェクト: bitton-yehonatan/ver_stamp
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
コード例 #6
0
ファイル: vmn.py プロジェクト: bitton-yehonatan/ver_stamp
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'])
コード例 #7
0
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
コード例 #8
0
ファイル: vmn.py プロジェクト: bitton-yehonatan/ver_stamp
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
コード例 #9
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
コード例 #10
0
 def allocate_backend(self):
     self._backend, _ = stamp_utils.get_client(self._root_path)
コード例 #11
0
ファイル: vmn.py プロジェクト: bitton-yehonatan/ver_stamp
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