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)
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)
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)
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)
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)
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)