Esempio n. 1
0
def gitext_add(external, src, dst, branch, tag, ref, vcs):
    """Add a git external to the current repo.

    Be sure to add '/' to `src` if it's a directory!
    It's possible to add multiple `dst` to the same `src`, however you cannot mix different branches, tags or refs
    for the same external.

    It's safe to use this command to add `src` to an already present external, as well as adding
    `dst` to an already present `src`.

    It requires one of --branch or --tag.
    """
    from git_externals import load_gitexts, dump_gitexts, normalize_gitexts, print_gitext_info

    git_externals = load_gitexts()

    if branch is None and tag is None:
        error('Please specifiy at least a branch or a tag', exitcode=3)

    if external not in git_externals:
        git_externals[external] = {'targets': {src: [dst]}}
        if branch is not None:
            git_externals[external]['branch'] = branch
            git_externals[external]['ref'] = ref
        else:
            git_externals[external]['tag'] = tag
        if vcs == 'auto':
            git_externals.update(
                normalize_gitexts({external: git_externals[external]}))
        else:
            git_externals[external]['vcs'] = vcs

    else:
        if branch is not None:
            if 'branch' not in git_externals[external]:
                error(
                    '{} is bound to tag {}, cannot set it to branch {}'.format(
                        external, git_externals[external]['tag'], branch),
                    exitcode=4)

            if ref != git_externals[external]['ref']:
                error('{} is bound to ref {}, cannot set it to ref {}'.format(
                    external, git_externals[external]['ref'], ref),
                      exitcode=4)

        elif 'tag' not in git_externals[external]:
            error('{} is bound to branch {}, cannot set it to tag {}'.format(
                external, git_externals[external]['branch'], tag),
                  exitcode=4)

        if dst not in git_externals[external]['targets'].setdefault(src, []):
            git_externals[external]['targets'][src].append(dst)

    print_gitext_info(external, git_externals[external], root_dir='.')
    dump_gitexts(git_externals)
Esempio n. 2
0
def gitext_remove(external):
    """Remove the externals at the given repository URLs """
    from git_externals import load_gitexts, dump_gitexts

    git_externals = load_gitexts()

    for ext in external:
        if ext in git_externals:
            del git_externals[ext]

    dump_gitexts(git_externals)
Esempio n. 3
0
def gitext_add(external, src, dst, branch, tag, ref, vcs):
    """Add a git external to the current repo.

    Be sure to add '/' to `src` if it's a directory!
    It's possible to add multiple `dst` to the same `src`, however you cannot mix different branches, tags or refs
    for the same external.

    It's safe to use this command to add `src` to an already present external, as well as adding
    `dst` to an already present `src`.

    It requires one of --branch or --tag.
    """
    from git_externals import load_gitexts, dump_gitexts, normalize_gitexts, print_gitext_info

    git_externals = load_gitexts()

    if branch is None and tag is None:
        error('Please specifiy at least a branch or a tag', exitcode=3)

    if external not in git_externals:
        git_externals[external] = {'targets': {src: [dst]}}
        if branch is not None:
            git_externals[external]['branch'] = branch
            git_externals[external]['ref'] = ref
        else:
            git_externals[external]['tag'] = tag
        if vcs == 'auto':
            git_externals.update(normalize_gitexts({external: git_externals[external]}))
        else:
            git_externals[external]['vcs'] = vcs

    else:
        if branch is not None:
            if 'branch' not in git_externals[external]:
                error(
                    '{} is bound to tag {}, cannot set it to branch {}'.format(
                        external, git_externals[external]['tag'], branch),
                    exitcode=4)

            if ref != git_externals[external]['ref']:
                error('{} is bound to ref {}, cannot set it to ref {}'.format(
                    external, git_externals[external]['ref'], ref),
                    exitcode=4)

        elif 'tag' not in git_externals[external]:
            error('{} is bound to branch {}, cannot set it to tag {}'.format(
                external, git_externals[external]['branch'], tag),
                exitcode=4)

        if dst not in git_externals[external]['targets'].setdefault(src, []):
            git_externals[external]['targets'][src].append(dst)

    print_gitext_info(external, git_externals[external], root_dir='.')
    dump_gitexts(git_externals)
Esempio n. 4
0
def gitext_remove(external):
    """Remove the externals at the given repository URLs """
    from git_externals import load_gitexts, dump_gitexts

    git_externals = load_gitexts()

    for ext in external:
        if ext in git_externals:
            del git_externals[ext]

    dump_gitexts(git_externals)
Esempio n. 5
0
def gitext_freeze(externals, messages):
    """Freeze the externals revision"""
    from git_externals import load_gitexts, dump_gitexts, foreach_externals_dir, root_path, resolve_revision
    git_externals = load_gitexts()
    repo_root = root_path()
    re_from_git_svn_id = re.compile("git-svn-id:.*@(\d+)")
    re_from_svnversion = re.compile("(\d+):(\d+)")

    def get_version(rel_url, ext_path, refs):
        if 'tag' in refs:
            return

        bare_svn = False
        if git_externals[rel_url]["vcs"] == "svn":
            revision = command('svnversion', '-c').strip()
            match = re_from_svnversion.search(revision)
            if match:
                revision = "svn:r" + match.group(2)  # 565:56555 -> svn:r56555
                bare_svn = True
            else:
                message = git("log", "--format=%b", "--grep", "git-svn-id:",
                              "-1")
                match = re_from_git_svn_id.search(message)
                if match:
                    revision = "svn:r" + match.group(1)
                else:
                    here = os.path.relpath(os.getcwd(), repo_root)
                    error(
                        "Unsupported external format, svn or git-svn repo expected:\n\t{}"
                        .format(here))
        else:
            branch_name = current_branch()
            remote_name = git("config", "branch.%s.remote" % branch_name)
            revision = git("log", "%s/%s" % (remote_name, branch_name), "-1",
                           "--format=%H")

        info("Freeze {0} at {1}".format(rel_url, revision))
        if messages and not bare_svn:
            old = resolve_revision(git_externals[rel_url]["ref"])
            new = resolve_revision(revision)
            git("log",
                "--format=- %h %s",
                "{}..{}".format(old, new),
                capture=False)
        git_externals[rel_url]["ref"] = revision

    foreach_externals_dir(repo_root, get_version, only=externals)

    dump_gitexts(git_externals)
Esempio n. 6
0
def gitext_freeze(externals, messages):
    """Freeze the externals revision"""
    from git_externals import load_gitexts, dump_gitexts, foreach_externals_dir, root_path, resolve_revision
    git_externals = load_gitexts()
    repo_root = root_path()
    re_from_git_svn_id = re.compile("git-svn-id:.*@(\d+)")
    re_from_svnversion = re.compile("(\d+):(\d+)")

    def get_version(rel_url, ext_path, refs):
        if 'tag' in refs:
            return

        bare_svn = False
        if git_externals[rel_url]["vcs"] == "svn":
            revision = command('svnversion', '-c').strip()
            match = re_from_svnversion.search(revision)
            if match:
                revision = "svn:r" + match.group(2)  # 565:56555 -> svn:r56555
                bare_svn = True
            else:
                message = git("log", "--format=%b", "--grep", "git-svn-id:", "-1")
                match = re_from_git_svn_id.search(message)
                if match:
                    revision = "svn:r" + match.group(1)
                else:
                    here = os.path.relpath(os.getcwd(), repo_root)
                    error("Unsupported external format, svn or git-svn repo expected:\n\t{}".format(here))
        else:
            branch_name = current_branch()
            remote_name = git("config", "branch.%s.remote" % branch_name)
            revision = git("log", "%s/%s" % (remote_name, branch_name), "-1", "--format=%H")

        info("Freeze {0} at {1}".format(rel_url, revision))
        if messages and not bare_svn:
            old = resolve_revision(git_externals[rel_url]["ref"])
            new = resolve_revision(revision)
            git("log", "--format=- %h %s", "{}..{}".format(old, new), capture=False)
        git_externals[rel_url]["ref"] = revision

    foreach_externals_dir(repo_root, get_version, only=externals)

    dump_gitexts(git_externals)
Esempio n. 7
0
def gitext_freeze(externals):
    """Freeze the externals revision"""
    from git_externals import load_gitexts, dump_gitexts, foreach_externals_dir, root_path
    git_externals = load_gitexts()
    re_from_git_svn_id = re.compile("git-svn-id:.*@(\d+)")
    re_from_svnversion = re.compile("(\d+):(\d+)")

    def get_version(rel_url, ext_path, refs):
        if 'tag' in refs:
            return

        if git_externals[rel_url]["vcs"] == "svn":
            revision = command('svnversion', '-c').strip()
            match = re_from_svnversion.search(revision)
            if match:
                revision = "svn:r" + match.group(2)  # 565:56555 -> svn:r56555
            else:
                message = git("log", "--format=%b", "--grep", "git-svn-id:",
                              "-1")
                match = re_from_git_svn_id.search(message)
                if match:
                    revision = "svn:r" + match.group(1)
                else:
                    error(
                        "Unsupported external format, should be svn or git-svn repo"
                    )
        else:
            branch_name = current_branch()
            remote_name = git("config", "branch.%s.remote" % branch_name)
            revision = git("log", "%s/%s" % (remote_name, branch_name), "-1",
                           "--format=%H")

        info("Freeze {0} at {1}".format(rel_url, revision))
        git_externals[rel_url]["ref"] = revision

    foreach_externals_dir(root_path(), get_version, only=externals)

    dump_gitexts(git_externals)