def git_id(rev): """Return the GIT id """ if not rev: return None try: patch, branch, patch_id = parse_rev(rev) if branch == None: series = crt_series else: series = stack.Series(branch) if patch == None: patch = series.get_current() if not patch: raise CmdException, 'No patches applied' if patch in series.get_applied() or patch in series.get_unapplied() or \ patch in series.get_hidden(): if patch_id in ['top', '', None]: return series.get_patch(patch).get_top() elif patch_id == 'bottom': return series.get_patch(patch).get_bottom() elif patch_id == 'top.old': return series.get_patch(patch).get_old_top() elif patch_id == 'bottom.old': return series.get_patch(patch).get_old_bottom() elif patch_id == 'log': return series.get_patch(patch).get_log() if patch == 'base' and patch_id == None: return series.get_base() except RevParseException: pass return git.rev_parse(rev + '^{commit}')
def get_parent_branch(self): value = config.get("branch.%s.stgit.parentbranch" % self.get_name()) if value: return value elif git.rev_parse("heads/origin"): out.note( ('No parent branch declared for stack "%s",' ' defaulting to "heads/origin".' % self.get_name()), ('Consider setting "branch.%s.stgit.parentbranch"' ' with "git config".' % self.get_name()), ) return "heads/origin" else: raise StackException, 'Cannot find a parent branch for "%s"' % self.get_name()
def get_parent_branch(self): value = config.get('branch.%s.stgit.parentbranch' % self.get_name()) if value: return value elif git.rev_parse('heads/origin'): out.note(('No parent branch declared for stack "%s",' ' defaulting to "heads/origin".' % self.get_name()), ('Consider setting "branch.%s.stgit.parentbranch"' ' with "git config".' % self.get_name())) return 'heads/origin' else: raise StackException('Cannot find a parent branch for "%s"' % self.get_name())
def get_top(self): return git.rev_parse(self.__top_ref)
def func(parser, options, args): if options.create: if len(args) == 0 or len(args) > 2: parser.error("incorrect number of arguments") check_local_changes() check_conflicts() check_head_top_equal(crt_series) tree_id = None if len(args) >= 2: parentbranch = None try: branchpoint = git.rev_parse(args[1]) # parent branch? head_re = re.compile("refs/(heads|remotes)/") ref_re = re.compile(args[1] + "$") for ref in git.all_refs(): if head_re.match(ref) and ref_re.search(ref): # args[1] is a valid ref from the branchpoint # setting above parentbranch = args[1] break except git.GitException: # should use a more specific exception to catch only # non-git refs ? out.info("Don't know how to determine parent branch" ' from "%s"' % args[1]) # exception in branch = rev_parse() leaves branchpoint unbound branchpoint = None tree_id = git_id(crt_series, branchpoint or args[1]) if parentbranch: out.info('Recording "%s" as parent branch' % parentbranch) else: out.info("Don't know how to determine parent branch" ' from "%s"' % args[1]) else: # branch stack off current branch parentbranch = git.get_head_file() if parentbranch: parentremote = git.identify_remote(parentbranch) if parentremote: out.info('Using remote "%s" to pull parent from' % parentremote) else: out.info("Recording as a local branch") else: # no known parent branch, can't guess the remote parentremote = None stack.Series(args[0]).init(create_at=tree_id, parent_remote=parentremote, parent_branch=parentbranch) out.info('Branch "%s" created' % args[0]) log.compat_log_entry("branch --create") return elif options.clone: if len(args) == 0: clone = crt_series.get_name() + time.strftime("-%C%y%m%d-%H%M%S") elif len(args) == 1: clone = args[0] else: parser.error("incorrect number of arguments") check_local_changes() check_conflicts() check_head_top_equal(crt_series) out.start('Cloning current branch to "%s"' % clone) crt_series.clone(clone) out.done() log.copy_log(log.default_repo(), crt_series.get_name(), clone, "branch --clone") return elif options.delete: if len(args) != 1: parser.error("incorrect number of arguments") __delete_branch(args[0], options.force) log.delete_log(log.default_repo(), args[0]) return elif options.cleanup: if not args: name = crt_series.get_name() elif len(args) == 1: name = args[0] else: parser.error("incorrect number of arguments") __cleanup_branch(name, options.force) log.delete_log(log.default_repo(), name) return elif options.list: if len(args) != 0: parser.error("incorrect number of arguments") branches = set(git.get_heads()) for br in set(branches): m = re.match(r"^(.*)\.stgit$", br) if m and m.group(1) in branches: branches.remove(br) if branches: out.info("Available branches:") max_len = max([len(i) for i in branches]) for i in sorted(branches): __print_branch(i, max_len) else: out.info("No branches") return elif options.protect: if len(args) == 0: branch_name = crt_series.get_name() elif len(args) == 1: branch_name = args[0] else: parser.error("incorrect number of arguments") branch = stack.Series(branch_name) if not branch.is_initialised(): raise CmdException, 'Branch "%s" is not controlled by StGIT' % branch_name out.start('Protecting branch "%s"' % branch_name) branch.protect() out.done() return elif options.rename: if len(args) != 2: parser.error("incorrect number of arguments") if __is_current_branch(args[0]): raise CmdException, "Renaming the current branch is not supported" stack.Series(args[0]).rename(args[1]) out.info('Renamed branch "%s" to "%s"' % (args[0], args[1])) log.rename_log(log.default_repo(), args[0], args[1], "branch --rename") return elif options.unprotect: if len(args) == 0: branch_name = crt_series.get_name() elif len(args) == 1: branch_name = args[0] else: parser.error("incorrect number of arguments") branch = stack.Series(branch_name) if not branch.is_initialised(): raise CmdException, 'Branch "%s" is not controlled by StGIT' % branch_name out.info('Unprotecting branch "%s"' % branch_name) branch.unprotect() out.done() return elif options.description is not None: if len(args) == 0: branch_name = crt_series.get_name() elif len(args) == 1: branch_name = args[0] else: parser.error("incorrect number of arguments") branch = stack.Series(branch_name) if not branch.is_initialised(): raise CmdException, 'Branch "%s" is not controlled by StGIT' % branch_name branch.set_description(options.description) return elif len(args) == 1: if __is_current_branch(args[0]): raise CmdException, 'Branch "%s" is already the current branch' % args[0] if not options.merge: check_local_changes() check_conflicts() check_head_top_equal(crt_series) out.start('Switching to branch "%s"' % args[0]) git.switch_branch(args[0]) out.done() return # default action: print the current branch if len(args) != 0: parser.error("incorrect number of arguments") print crt_series.get_name()
def func(parser, options, args): if options.create: if len(args) == 0 or len(args) > 2: parser.error('incorrect number of arguments') check_local_changes() check_conflicts() check_head_top_equal(crt_series) tree_id = None if len(args) >= 2: parentbranch = None try: branchpoint = git.rev_parse(args[1]) # parent branch? head_re = re.compile('refs/(heads|remotes)/') ref_re = re.compile(args[1] + '$') for ref in git.all_refs(): if head_re.match(ref) and ref_re.search(ref): # args[1] is a valid ref from the branchpoint # setting above parentbranch = args[1] break except git.GitException: # should use a more specific exception to catch only # non-git refs ? out.info('Don\'t know how to determine parent branch' ' from "%s"' % args[1]) # exception in branch = rev_parse() leaves branchpoint unbound branchpoint = None tree_id = git_id(crt_series, branchpoint or args[1]) if parentbranch: out.info('Recording "%s" as parent branch' % parentbranch) else: out.info('Don\'t know how to determine parent branch' ' from "%s"' % args[1]) else: # branch stack off current branch parentbranch = git.get_head_file() if parentbranch: parentremote = git.identify_remote(parentbranch) if parentremote: out.info('Using remote "%s" to pull parent from' % parentremote) else: out.info('Recording as a local branch') else: # no known parent branch, can't guess the remote parentremote = None stack.Series(args[0]).init(create_at=tree_id, parent_remote=parentremote, parent_branch=parentbranch) out.info('Branch "%s" created' % args[0]) log.compat_log_entry('branch --create') return elif options.clone: if len(args) == 0: clone = crt_series.get_name() + \ time.strftime('-%C%y%m%d-%H%M%S') elif len(args) == 1: clone = args[0] else: parser.error('incorrect number of arguments') check_local_changes() check_conflicts() check_head_top_equal(crt_series) out.start('Cloning current branch to "%s"' % clone) crt_series.clone(clone) out.done() log.copy_log(log.default_repo(), crt_series.get_name(), clone, 'branch --clone') return elif options.delete: if len(args) != 1: parser.error('incorrect number of arguments') __delete_branch(args[0], options.force) log.delete_log(log.default_repo(), args[0]) return elif options.cleanup: if not args: name = crt_series.get_name() elif len(args) == 1: name = args[0] else: parser.error('incorrect number of arguments') __cleanup_branch(name, options.force) log.delete_log(log.default_repo(), name) return elif options.list: if len(args) != 0: parser.error('incorrect number of arguments') branches = set(git.get_heads()) for br in set(branches): m = re.match(r'^(.*)\.stgit$', br) if m and m.group(1) in branches: branches.remove(br) if branches: out.info('Available branches:') max_len = max([len(i) for i in branches]) for i in sorted(branches): __print_branch(i, max_len) else: out.info('No branches') return elif options.protect: if len(args) == 0: branch_name = crt_series.get_name() elif len(args) == 1: branch_name = args[0] else: parser.error('incorrect number of arguments') branch = stack.Series(branch_name) if not branch.is_initialised(): raise CmdException('Branch "%s" is not controlled by StGIT' % branch_name) out.start('Protecting branch "%s"' % branch_name) branch.protect() out.done() return elif options.rename: if len(args) != 2: parser.error('incorrect number of arguments') if __is_current_branch(args[0]): raise CmdException('Renaming the current branch is not supported') stack.Series(args[0]).rename(args[1]) out.info('Renamed branch "%s" to "%s"' % (args[0], args[1])) log.rename_log(log.default_repo(), args[0], args[1], 'branch --rename') return elif options.unprotect: if len(args) == 0: branch_name = crt_series.get_name() elif len(args) == 1: branch_name = args[0] else: parser.error('incorrect number of arguments') branch = stack.Series(branch_name) if not branch.is_initialised(): raise CmdException('Branch "%s" is not controlled by StGIT' % branch_name) out.info('Unprotecting branch "%s"' % branch_name) branch.unprotect() out.done() return elif options.description is not None: if len(args) == 0: branch_name = crt_series.get_name() elif len(args) == 1: branch_name = args[0] else: parser.error('incorrect number of arguments') branch = stack.Series(branch_name) if not branch.is_initialised(): raise CmdException('Branch "%s" is not controlled by StGIT' % branch_name) branch.set_description(options.description) return elif len(args) == 1: if __is_current_branch(args[0]): raise CmdException('Branch "%s" is already the current branch' % args[0]) if not options.merge: check_local_changes() check_conflicts() check_head_top_equal(crt_series) out.start('Switching to branch "%s"' % args[0]) git.switch_branch(args[0]) out.done() return # default action: print the current branch if len(args) != 0: parser.error('incorrect number of arguments') print(crt_series.get_name())
def func(parser, options, args): if options.create: if len(args) == 0 or len(args) > 2: parser.error('incorrect number of arguments') check_local_changes() check_conflicts() check_head_top_equal() tree_id = None if len(args) >= 2: parentbranch = None try: branchpoint = git.rev_parse(args[1]) # first, look for branchpoint in well-known branch namespaces for namespace in ('refs/heads/', 'remotes/'): # check if branchpoint exists in namespace try: maybehead = git.rev_parse(namespace + args[1]) except git.GitException: maybehead = None # check if git resolved branchpoint to this namespace if maybehead and branchpoint == maybehead: # we are for sure referring to a branch parentbranch = namespace + args[1] except git.GitException: # should use a more specific exception to catch only # non-git refs ? out.info('Don\'t know how to determine parent branch' ' from "%s"' % args[1]) # exception in branch = rev_parse() leaves branchpoint unbound branchpoint = None tree_id = branchpoint or git_id(args[1]) if parentbranch: out.info('Recording "%s" as parent branch' % parentbranch) else: out.info('Don\'t know how to determine parent branch' ' from "%s"' % args[1]) else: # branch stack off current branch parentbranch = git.get_head_file() if parentbranch: parentremote = git.identify_remote(parentbranch) if parentremote: out.info('Using remote "%s" to pull parent from' % parentremote) else: out.info('Recording as a local branch') else: # no known parent branch, can't guess the remote parentremote = None stack.Series(args[0]).init(create_at = tree_id, parent_remote = parentremote, parent_branch = parentbranch) out.info('Branch "%s" created' % args[0]) return elif options.clone: if len(args) == 0: clone = crt_series.get_name() + \ time.strftime('-%C%y%m%d-%H%M%S') elif len(args) == 1: clone = args[0] else: parser.error('incorrect number of arguments') check_local_changes() check_conflicts() check_head_top_equal() out.start('Cloning current branch to "%s"' % clone) crt_series.clone(clone) out.done() return elif options.delete: if len(args) != 1: parser.error('incorrect number of arguments') __delete_branch(args[0], options.force) return elif options.list: if len(args) != 0: parser.error('incorrect number of arguments') branches = [] basepath = os.path.join(basedir.get(), 'refs', 'heads') for path, files, dirs in walk_tree(basepath): branches += [os.path.join(path, f) for f in files] branches.sort() if branches: out.info('Available branches:') max_len = max([len(i) for i in branches]) for i in branches: __print_branch(i, max_len) else: out.info('No branches') return elif options.protect: if len(args) == 0: branch_name = crt_series.get_name() elif len(args) == 1: branch_name = args[0] else: parser.error('incorrect number of arguments') branch = stack.Series(branch_name) if not branch.is_initialised(): raise CmdException, 'Branch "%s" is not controlled by StGIT' \ % branch_name out.start('Protecting branch "%s"' % branch_name) branch.protect() out.done() return elif options.rename: if len(args) != 2: parser.error('incorrect number of arguments') if __is_current_branch(args[0]): raise CmdException, 'Renaming the current branch is not supported' stack.Series(args[0]).rename(args[1]) out.info('Renamed branch "%s" to "%s"' % (args[0], args[1])) return elif options.unprotect: if len(args) == 0: branch_name = crt_series.get_name() elif len(args) == 1: branch_name = args[0] else: parser.error('incorrect number of arguments') branch = stack.Series(branch_name) if not branch.is_initialised(): raise CmdException, 'Branch "%s" is not controlled by StGIT' \ % branch_name out.info('Unprotecting branch "%s"' % branch_name) branch.unprotect() out.done() return elif options.description is not None: if len(args) == 0: branch_name = crt_series.get_name() elif len(args) == 1: branch_name = args[0] else: parser.error('incorrect number of arguments') branch = stack.Series(branch_name) if not branch.is_initialised(): raise CmdException, 'Branch "%s" is not controlled by StGIT' \ % branch_name branch.set_description(options.description) return elif len(args) == 1: if __is_current_branch(args[0]): raise CmdException, 'Branch "%s" is already the current branch' \ % args[0] check_local_changes() check_conflicts() check_head_top_equal() out.start('Switching to branch "%s"' % args[0]) git.switch_branch(args[0]) out.done() return # default action: print the current branch if len(args) != 0: parser.error('incorrect number of arguments') print crt_series.get_name()
def func(parser, options, args): """Uncommit a number of patches. """ if options.to: if options.number: parser.error('cannot give both --to and --number') if len(args) != 0: parser.error('cannot specify patch name with --to') patch_nr = patchnames = None to_commit = git.rev_parse(options.to) elif options.number: if options.number <= 0: parser.error('invalid value passed to --number') patch_nr = options.number if len(args) == 0: patchnames = None elif len(args) == 1: # prefix specified patchnames = ['%s%d' % (args[0], i) for i in xrange(patch_nr, 0, -1)] else: parser.error('when using --number, specify at most one patch name') elif len(args) == 0: patchnames = None patch_nr = 1 else: patchnames = args patch_nr = len(patchnames) if crt_series.get_protected(): raise CmdException, \ 'This branch is protected. Uncommit is not permitted' def get_commit(commit_id): commit = git.Commit(commit_id) try: parent, = commit.get_parents() except ValueError: raise CmdException('Commit %s does not have exactly one parent' % commit_id) return (commit, commit_id, parent) commits = [] next_commit = crt_series.get_base() if patch_nr: out.start('Uncommitting %d patches' % patch_nr) for i in xrange(patch_nr): commit, commit_id, parent = get_commit(next_commit) commits.append((commit, commit_id, parent)) next_commit = parent else: out.start('Uncommitting to %s' % to_commit) while True: commit, commit_id, parent = get_commit(next_commit) commits.append((commit, commit_id, parent)) if commit_id == to_commit: break next_commit = parent patch_nr = len(commits) for (commit, commit_id, parent), patchname in \ zip(commits, patchnames or [None for i in xrange(len(commits))]): author_name, author_email, author_date = \ name_email_date(commit.get_author()) crt_series.new_patch(patchname, can_edit = False, before_existing = True, top = commit_id, bottom = parent, message = commit.get_log(), author_name = author_name, author_email = author_email, author_date = author_date) out.done()
def func(parser, options, args): if options.create: if len(args) == 0 or len(args) > 2: parser.error('incorrect number of arguments') check_local_changes() check_conflicts() check_head_top_equal() tree_id = None if len(args) >= 2: parentbranch = None try: branchpoint = git.rev_parse(args[1]) # first, look for branchpoint in well-known branch namespaces for namespace in ('refs/heads/', 'remotes/'): # check if branchpoint exists in namespace try: maybehead = git.rev_parse(namespace + args[1]) except git.GitException: maybehead = None # check if git resolved branchpoint to this namespace if maybehead and branchpoint == maybehead: # we are for sure referring to a branch parentbranch = namespace + args[1] except git.GitException: # should use a more specific exception to catch only # non-git refs ? out.info('Don\'t know how to determine parent branch' ' from "%s"' % args[1]) # exception in branch = rev_parse() leaves branchpoint unbound branchpoint = None tree_id = branchpoint or git_id(args[1]) if parentbranch: out.info('Recording "%s" as parent branch' % parentbranch) else: out.info('Don\'t know how to determine parent branch' ' from "%s"' % args[1]) else: # branch stack off current branch parentbranch = git.get_head_file() if parentbranch: parentremote = git.identify_remote(parentbranch) if parentremote: out.info('Using remote "%s" to pull parent from' % parentremote) else: out.info('Recording as a local branch') else: # no known parent branch, can't guess the remote parentremote = None stack.Series(args[0]).init(create_at=tree_id, parent_remote=parentremote, parent_branch=parentbranch) out.info('Branch "%s" created' % args[0]) return elif options.clone: if len(args) == 0: clone = crt_series.get_name() + \ time.strftime('-%C%y%m%d-%H%M%S') elif len(args) == 1: clone = args[0] else: parser.error('incorrect number of arguments') check_local_changes() check_conflicts() check_head_top_equal() out.start('Cloning current branch to "%s"' % clone) crt_series.clone(clone) out.done() return elif options.delete: if len(args) != 1: parser.error('incorrect number of arguments') __delete_branch(args[0], options.force) return elif options.list: if len(args) != 0: parser.error('incorrect number of arguments') branches = [] basepath = os.path.join(basedir.get(), 'refs', 'heads') for path, files, dirs in walk_tree(basepath): branches += [os.path.join(path, f) for f in files] branches.sort() if branches: out.info('Available branches:') max_len = max([len(i) for i in branches]) for i in branches: __print_branch(i, max_len) else: out.info('No branches') return elif options.protect: if len(args) == 0: branch_name = crt_series.get_name() elif len(args) == 1: branch_name = args[0] else: parser.error('incorrect number of arguments') branch = stack.Series(branch_name) if not branch.is_initialised(): raise CmdException, 'Branch "%s" is not controlled by StGIT' \ % branch_name out.start('Protecting branch "%s"' % branch_name) branch.protect() out.done() return elif options.rename: if len(args) != 2: parser.error('incorrect number of arguments') if __is_current_branch(args[0]): raise CmdException, 'Renaming the current branch is not supported' stack.Series(args[0]).rename(args[1]) out.info('Renamed branch "%s" to "%s"' % (args[0], args[1])) return elif options.unprotect: if len(args) == 0: branch_name = crt_series.get_name() elif len(args) == 1: branch_name = args[0] else: parser.error('incorrect number of arguments') branch = stack.Series(branch_name) if not branch.is_initialised(): raise CmdException, 'Branch "%s" is not controlled by StGIT' \ % branch_name out.info('Unprotecting branch "%s"' % branch_name) branch.unprotect() out.done() return elif options.description is not None: if len(args) == 0: branch_name = crt_series.get_name() elif len(args) == 1: branch_name = args[0] else: parser.error('incorrect number of arguments') branch = stack.Series(branch_name) if not branch.is_initialised(): raise CmdException, 'Branch "%s" is not controlled by StGIT' \ % branch_name branch.set_description(options.description) return elif len(args) == 1: if __is_current_branch(args[0]): raise CmdException, 'Branch "%s" is already the current branch' \ % args[0] check_local_changes() check_conflicts() check_head_top_equal() out.start('Switching to branch "%s"' % args[0]) git.switch_branch(args[0]) out.done() return # default action: print the current branch if len(args) != 0: parser.error('incorrect number of arguments') print crt_series.get_name()