Global variables baaad. Instead, pass it as a parameter to the
functions that need it.
Signed-off-by: Karl Hasselström <kha@treskal.com>
27 files changed:
check_local_changes()
check_conflicts()
check_local_changes()
check_conflicts()
+ check_head_top_equal(crt_series)
tree_id = None
if len(args) >= 2:
tree_id = None
if len(args) >= 2:
# exception in branch = rev_parse() leaves branchpoint unbound
branchpoint = None
# exception in branch = rev_parse() leaves branchpoint unbound
branchpoint = None
- tree_id = branchpoint or git_id(args[1])
+ tree_id = branchpoint or git_id(crt_series, args[1])
if parentbranch:
out.info('Recording "%s" as parent branch' % parentbranch)
if parentbranch:
out.info('Recording "%s" as parent branch' % parentbranch)
check_local_changes()
check_conflicts()
check_local_changes()
check_conflicts()
+ check_head_top_equal(crt_series)
out.start('Cloning current branch to "%s"' % clone)
crt_series.clone(clone)
out.start('Cloning current branch to "%s"' % clone)
crt_series.clone(clone)
check_local_changes()
check_conflicts()
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.start('Switching to branch "%s"' % args[0])
git.switch_branch(args[0])
check_local_changes()
check_conflicts()
check_local_changes()
check_conflicts()
+ check_head_top_equal(crt_series)
if not (options.applied or options.unapplied):
options.applied = options.unapplied = True
if not (options.applied or options.unapplied):
options.applied = options.unapplied = True
unapplied = crt_series.get_unapplied()
__delete_empty(unapplied, False)
unapplied = crt_series.get_unapplied()
__delete_empty(unapplied, False)
+ print_crt_patch(crt_series)
check_local_changes()
check_conflicts()
check_local_changes()
check_conflicts()
+ check_head_top_equal(crt_series)
applied = crt_series.get_applied()
if not applied:
applied = crt_series.get_applied()
if not applied:
from stgit import stack, git, basedir
from stgit.config import config, file_extensions
from stgit import stack, git, basedir
from stgit.config import config, file_extensions
# Command exception class
class CmdException(StgException):
# Command exception class
class CmdException(StgException):
# No, we can't parse that.
raise RevParseException
# No, we can't parse that.
raise RevParseException
+def git_id(crt_series, rev):
"""Return the GIT id
"""
if not rev:
"""Return the GIT id
"""
if not rev:
raise CmdException, \
'local changes in the tree. Use "refresh" or "status --reset"'
raise CmdException, \
'local changes in the tree. Use "refresh" or "status --reset"'
-def check_head_top_equal():
+def check_head_top_equal(crt_series):
if not crt_series.head_top_equal():
raise CmdException(
"""HEAD and top are not the same. This can happen if you
if not crt_series.head_top_equal():
raise CmdException(
"""HEAD and top are not the same. This can happen if you
'Unsolved conflicts. Please resolve them first or\n' \
' revert the changes with "status --reset"'
'Unsolved conflicts. Please resolve them first or\n' \
' revert the changes with "status --reset"'
-def print_crt_patch(branch = None):
+def print_crt_patch(crt_series, branch = None):
if not branch:
patch = crt_series.get_current()
else:
if not branch:
patch = crt_series.get_current()
else:
resolved(filename, reset)
os.remove(os.path.join(basedir.get(), 'conflicts'))
resolved(filename, reset)
os.remove(os.path.join(basedir.get(), 'conflicts'))
-def push_patches(patches, check_merged = False):
+def push_patches(crt_series, patches, check_merged = False):
"""Push multiple patches onto the stack. This function is shared
between the push and pull commands
"""
"""Push multiple patches onto the stack. This function is shared
between the push and pull commands
"""
-def pop_patches(patches, keep = False):
+def pop_patches(crt_series, patches, keep = False):
"""Pop the patches in the list from the stack. It is assumed that
the patches are listed in the stack reverse order.
"""
"""Pop the patches in the list from the stack. It is assumed that
the patches are listed in the stack reverse order.
"""
for addr in addr_str.split(',')]
return ', '.join([addr for addr in addr_list if addr])
for addr in addr_str.split(',')]
return ', '.join([addr for addr in addr_list if addr])
+def prepare_rebase(crt_series):
# pop all patches
applied = crt_series.get_applied()
if len(applied) > 0:
# pop all patches
applied = crt_series.get_applied()
if len(applied) > 0:
out.done()
return applied
out.done()
return applied
+def rebase(crt_series, target):
- tree_id = git_id(target)
+ tree_id = git_id(crt_series, target)
except:
# it might be that we use a custom rebase command with its own
# target type
except:
# it might be that we use a custom rebase command with its own
# target type
git.rebase(tree_id = tree_id)
out.done()
git.rebase(tree_id = tree_id)
out.done()
-def post_rebase(applied, nopush, merged):
+def post_rebase(crt_series, applied, nopush, merged):
# memorize that we rebased to here
crt_series._set_field('orig-base', git.get_head())
# push the patches back
if not nopush:
# memorize that we rebased to here
crt_series._set_field('orig-base', git.get_head())
# push the patches back
if not nopush:
- push_patches(applied, merged)
+ push_patches(crt_series, applied, merged)
#
# Patch description/e-mail/diff parsing
#
# Patch description/e-mail/diff parsing
if applied and not options.branch:
check_local_changes()
check_conflicts()
if applied and not options.branch:
check_local_changes()
check_conflicts()
+ check_head_top_equal(crt_series)
# delete the patches
for patch in applied + patches:
# delete the patches
for patch in applied + patches:
out.info('Patch "%s" successfully deleted' % patch)
if not options.branch:
out.info('Patch "%s" successfully deleted' % patch)
if not options.branch:
+ print_crt_patch(crt_series)
diff_flags = []
if options.stat:
diff_flags = []
if options.stat:
- out.stdout_raw(git.diffstat(args, git_id(rev1), git_id(rev2)) + '\n')
+ out.stdout_raw(git.diffstat(args, git_id(crt_series, rev1),
+ git_id(crt_series, rev2)) + '\n')
- diff_str = git.diff(args, git_id(rev1), git_id(rev2),
- diff_flags = diff_flags )
+ diff_str = git.diff(args, git_id(crt_series, rev1),
+ git_id(crt_series, rev2), diff_flags = diff_flags )
if diff_str:
pager(diff_str)
if diff_str:
pager(diff_str)
check_local_changes()
check_conflicts()
check_local_changes()
check_conflicts()
+ check_head_top_equal(crt_series)
if pname != crt_pname:
# Go to the patch to be edited
applied = crt_series.get_applied()
between = applied[:applied.index(pname):-1]
if pname != crt_pname:
# Go to the patch to be edited
applied = crt_series.get_applied()
between = applied[:applied.index(pname):-1]
+ pop_patches(crt_series, between)
if options.author:
options.authname, options.authemail = name_email(options.author)
if options.author:
options.authname, options.authemail = name_email(options.author)
if pname != crt_pname:
# Push the patches back
between.reverse()
if pname != crt_pname:
# Push the patches back
between.reverse()
+ push_patches(crt_series, between)
else:
parser.error('incorrect number of arguments')
else:
parser.error('incorrect number of arguments')
- rev1 = git_id('%s//bottom' % patch)
- rev2 = git_id('%s//top' % patch)
+ rev1 = git_id(crt_series, '%s//bottom' % patch)
+ rev2 = git_id(crt_series, '%s//top' % patch)
if options.stat:
out.stdout_raw(git.diffstat(rev1 = rev1, rev2 = rev2) + '\n')
if options.stat:
out.stdout_raw(git.diffstat(rev1 = rev1, rev2 = rev2) + '\n')
check_local_changes()
check_conflicts()
check_local_changes()
check_conflicts()
+ check_head_top_equal(crt_series)
unapplied = crt_series.get_unapplied()
applied = crt_series.get_applied()
unapplied = crt_series.get_unapplied()
applied = crt_series.get_applied()
# check whether the operation is really needed
if topop != topush:
if topop:
# check whether the operation is really needed
if topop != topush:
if topop:
+ pop_patches(crt_series, topop)
if topush:
topush.reverse()
if topush:
topush.reverse()
+ push_patches(crt_series, topush)
check_local_changes()
check_conflicts()
check_local_changes()
check_conflicts()
+ check_head_top_equal(crt_series)
if len(args) == 1:
filename = args[0]
if len(args) == 1:
filename = args[0]
bottom = crt_patch.get_bottom()
git.apply_patch(filename = filename, base = bottom)
elif options.base:
bottom = crt_patch.get_bottom()
git.apply_patch(filename = filename, base = bottom)
elif options.base:
- git.apply_patch(filename = filename, base = git_id(options.base))
+ git.apply_patch(filename = filename,
+ base = git_id(crt_series, options.base))
else:
git.apply_patch(filename = filename)
else:
git.apply_patch(filename = filename)
parser.error('incorrect number of arguments')
check_conflicts()
parser.error('incorrect number of arguments')
check_conflicts()
+ check_head_top_equal(crt_series)
if not options.keep:
check_local_changes()
if not options.keep:
check_local_changes()
if patch in applied:
applied.reverse()
patches = applied[:applied.index(patch)]
if patch in applied:
applied.reverse()
patches = applied[:applied.index(patch)]
- pop_patches(patches, options.keep)
+ pop_patches(crt_series, patches, options.keep)
elif patch in unapplied:
if options.keep:
raise CmdException, 'Cannot use --keep with patch pushing'
patches = unapplied[:unapplied.index(patch)+1]
elif patch in unapplied:
if options.keep:
raise CmdException, 'Cannot use --keep with patch pushing'
patches = unapplied[:unapplied.index(patch)+1]
+ push_patches(crt_series, patches)
else:
raise CmdException, 'Patch "%s" does not exist' % patch
else:
raise CmdException, 'Patch "%s" does not exist' % patch
+ print_crt_patch(crt_series)
else:
parser.error('incorrect number of arguments')
else:
parser.error('incorrect number of arguments')
- out.stdout(git_id(id_str))
+ out.stdout(git_id(crt_series, id_str))
else:
out.start('Importing patch "%s"' % patch)
if options.base:
else:
out.start('Importing patch "%s"' % patch)
if options.base:
- git.apply_patch(diff = diff, base = git_id(options.base))
+ git.apply_patch(diff = diff,
+ base = git_id(crt_series, options.base))
else:
git.apply_patch(diff = diff)
crt_series.refresh_patch(edit = options.edit,
else:
git.apply_patch(diff = diff)
crt_series.refresh_patch(edit = options.edit,
check_local_changes()
check_conflicts()
check_local_changes()
check_conflicts()
+ check_head_top_equal(crt_series)
if len(args) == 1:
filename = args[0]
if len(args) == 1:
filename = args[0]
else:
__import_file(filename, options)
else:
__import_file(filename, options)
+ print_crt_patch(crt_series)
'shortlog': stack.shortlog(crt_series.get_patch(p)
for p in patches),
'diffstat': git.diffstat(
'shortlog': stack.shortlog(crt_series.get_patch(p)
for p in patches),
'diffstat': git.diffstat(
- rev1 = git_id('%s//bottom' % patches[0]),
- rev2 = git_id('%s//top' % patches[-1]))}
+ rev1 = git_id(crt_series, '%s//bottom' % patches[0]),
+ rev2 = git_id(crt_series, '%s//top' % patches[-1]))}
try:
msg_string = tmpl % tmpl_dict
try:
msg_string = tmpl % tmpl_dict
'longdescr': long_descr,
# for backward template compatibility
'endofheaders': '',
'longdescr': long_descr,
# for backward template compatibility
'endofheaders': '',
- 'diff': git.diff(rev1 = git_id('%s//bottom' % patch),
- rev2 = git_id('%s//top' % patch),
- diff_flags = diff_flags ),
- 'diffstat': git.diffstat(rev1 = git_id('%s//bottom'%patch),
- rev2 = git_id('%s//top' % patch)),
+ 'diff': git.diff(
+ rev1 = git_id(crt_series, '%s//bottom' % patch),
+ rev2 = git_id(crt_series, '%s//top' % patch),
+ diff_flags = diff_flags),
+ 'diffstat': git.diffstat(
+ rev1 = git_id(crt_series, '%s//bottom'%patch),
+ rev2 = git_id(crt_series, '%s//top' % patch)),
# for backward template compatibility
'date': '',
'version': version_str,
# for backward template compatibility
'date': '',
'version': version_str,
parser.error('incorrect number of arguments')
check_conflicts()
parser.error('incorrect number of arguments')
check_conflicts()
+ check_head_top_equal(crt_series)
if options.author:
options.authname, options.authemail = name_email(options.author)
if options.author:
options.authname, options.authemail = name_email(options.author)
if not options.unapplied:
check_local_changes()
check_conflicts()
if not options.unapplied:
check_local_changes()
check_conflicts()
+ check_head_top_equal(crt_series)
- commit_id = git_id(commit_str)
+ commit_id = git_id(crt_series, commit_str)
commit = git.Commit(commit_id)
if options.fold or options.update:
commit = git.Commit(commit_id)
if options.fold or options.update:
patchname = None
if options.parent:
patchname = None
if options.parent:
- parent = git_id(options.parent)
+ parent = git_id(crt_series, options.parent)
else:
parent = commit.get_parent()
else:
parent = commit.get_parent()
out.done()
elif options.update:
out.done()
elif options.update:
- rev1 = git_id('//bottom')
- rev2 = git_id('//top')
+ rev1 = git_id(crt_series, '//bottom')
+ rev2 = git_id(crt_series, '//top')
files = git.barefiles(rev1, rev2).split('\n')
out.start('Updating with commit %s' % commit_id)
files = git.barefiles(rev1, rev2).split('\n')
out.start('Updating with commit %s' % commit_id)
+ print_crt_patch(crt_series)
"""Pop the topmost patch from the stack
"""
check_conflicts()
"""Pop the topmost patch from the stack
"""
check_conflicts()
+ check_head_top_equal(crt_series)
if not options.keep:
check_local_changes()
if not options.keep:
check_local_changes()
raise CmdException, 'Cannot pop arbitrary patches with --keep'
topop.reverse()
raise CmdException, 'Cannot pop arbitrary patches with --keep'
topop.reverse()
- pop_patches(topop, options.keep)
+ pop_patches(crt_series, topop, options.keep)
+ push_patches(crt_series, topush)
+ print_crt_patch(crt_series)
check_local_changes()
check_conflicts()
check_local_changes()
check_conflicts()
+ check_head_top_equal(crt_series)
if policy not in ['pull', 'fetch-rebase', 'rebase']:
raise GitConfigException, 'Unsupported pull-policy "%s"' % policy
if policy not in ['pull', 'fetch-rebase', 'rebase']:
raise GitConfigException, 'Unsupported pull-policy "%s"' % policy
- applied = prepare_rebase()
+ applied = prepare_rebase(crt_series)
# pull the remote changes
if policy == 'pull':
# pull the remote changes
if policy == 'pull':
target = git.fetch_head()
except git.GitException:
out.error('Could not find the remote head to rebase onto, pushing any patches back...')
target = git.fetch_head()
except git.GitException:
out.error('Could not find the remote head to rebase onto, pushing any patches back...')
- post_rebase(applied, False, False)
+ post_rebase(crt_series, applied, False, False)
raise CmdException, 'Could not find the remote head to rebase onto - fix branch.%s.merge in .git/config' % crt_series.get_name()
raise CmdException, 'Could not find the remote head to rebase onto - fix branch.%s.merge in .git/config' % crt_series.get_name()
+ rebase(crt_series, target)
- rebase(crt_series.get_parent_branch())
+ rebase(crt_series, crt_series.get_parent_branch())
- post_rebase(applied, options.nopush, options.merged)
+ post_rebase(crt_series, applied, options.nopush, options.merged)
# maybe tidy up
if config.get('stgit.keepoptimized') == 'yes':
git.repack()
# maybe tidy up
if config.get('stgit.keepoptimized') == 'yes':
git.repack()
+ print_crt_patch(crt_series)
out.done()
else:
out.done('patch unchanged')
out.done()
else:
out.done('patch unchanged')
+ print_crt_patch(crt_series)
return
check_local_changes()
check_conflicts()
return
check_local_changes()
check_conflicts()
+ check_head_top_equal(crt_series)
unapplied = crt_series.get_unapplied()
if not unapplied:
unapplied = crt_series.get_unapplied()
if not unapplied:
if options.reverse:
patches.reverse()
if options.reverse:
patches.reverse()
- push_patches(patches, options.merged)
+ push_patches(crt_series, patches, options.merged)
+ print_crt_patch(crt_series)
check_local_changes()
check_conflicts()
check_local_changes()
check_conflicts()
+ check_head_top_equal(crt_series)
# ensure an exception is raised before popping on non-existent target
# ensure an exception is raised before popping on non-existent target
- if git_id(args[0]) == None:
+ if git_id(crt_series, args[0]) == None:
raise GitException, 'Unknown revision: %s' % args[0]
raise GitException, 'Unknown revision: %s' % args[0]
- applied = prepare_rebase()
- rebase(args[0])
- post_rebase(applied, options.nopush, options.merged)
+ applied = prepare_rebase(crt_series)
+ rebase(crt_series, args[0])
+ post_rebase(crt_series, applied, options.nopush, options.merged)
+ print_crt_patch(crt_series)
raise CmdException, 'No patches applied'
if not options.force:
raise CmdException, 'No patches applied'
if not options.force:
+ check_head_top_equal(crt_series)
if options.undo:
out.start('Undoing the refresh of "%s"' % patch)
if options.undo:
out.start('Undoing the refresh of "%s"' % patch)
if options.patch:
applied = crt_series.get_applied()
between = applied[:applied.index(patch):-1]
if options.patch:
applied = crt_series.get_applied()
between = applied[:applied.index(patch):-1]
- pop_patches(between, keep = True)
+ pop_patches(crt_series, between, keep = True)
- rev1 = git_id('//bottom')
- rev2 = git_id('//top')
+ rev1 = git_id(crt_series, '//bottom')
+ rev2 = git_id(crt_series, '//top')
patch_files = git.barefiles(rev1, rev2).split('\n')
files = [f for f in files if f in patch_files]
if not files:
patch_files = git.barefiles(rev1, rev2).split('\n')
files = [f for f in files if f in patch_files]
if not files:
if options.patch:
between.reverse()
if options.patch:
between.reverse()
+ push_patches(crt_series, between)
elif options.annotate:
# only annotate the top log entry as there is no need to
# refresh the patch and generate a full commit
elif options.annotate:
# only annotate the top log entry as there is no need to
# refresh the patch and generate a full commit
raise CmdException, '--graphical not supported with --missing'
if applied:
raise CmdException, '--graphical not supported with --missing'
if applied:
- gitk_args = ' %s^..%s' % (git_id(applied[0]), git_id(applied[-1]))
+ gitk_args = ' %s^..%s' % (git_id(crt_series, applied[0]),
+ git_id(crt_series, applied[-1]))
else:
gitk_args = ''
for p in unapplied:
else:
gitk_args = ''
for p in unapplied:
+ patch_id = git_id(crt_series, p)
gitk_args += ' %s^..%s' % (patch_id, patch_id)
if os.system('gitk%s' % gitk_args) != 0:
gitk_args += ' %s^..%s' % (patch_id, patch_id)
if os.system('gitk%s' % gitk_args) != 0:
- commit_ids = [git_id(patch) for patch in patches]
+ commit_ids = [git_id(crt_series, patch) for patch in patches]
commit_str = '\n'.join([git.pretty_commit(commit_id, diff_flags=diff_flags)
for commit_id in commit_ids])
if commit_str:
commit_str = '\n'.join([git.pretty_commit(commit_id, diff_flags=diff_flags)
for commit_id in commit_ids])
if commit_str:
check_local_changes()
check_conflicts()
check_local_changes()
check_conflicts()
+ check_head_top_equal(crt_series)
oldapplied = crt_series.get_applied()
unapplied = crt_series.get_unapplied()
oldapplied = crt_series.get_applied()
unapplied = crt_series.get_unapplied()
patches = [ crt_series.get_current() ]
crt_series.pop_patch(options.to or oldapplied[0])
patches = [ crt_series.get_current() ]
crt_series.pop_patch(options.to or oldapplied[0])
+ push_patches(crt_series, patches)
if not options.nopush:
newapplied = crt_series.get_applied()
def not_reapplied_yet(p):
return not p in newapplied
if not options.nopush:
newapplied = crt_series.get_applied()
def not_reapplied_yet(p):
return not p in newapplied
- push_patches(filter(not_reapplied_yet, oldapplied))
+ push_patches(crt_series, filter(not_reapplied_yet, oldapplied))
def __check_all():
check_local_changes()
check_conflicts()
def __check_all():
check_local_changes()
check_conflicts()
+ check_head_top_equal(crt_series)
def __branch_merge_patch(remote_series, pname):
"""Merge a patch from a remote branch into the current tree.
def __branch_merge_patch(remote_series, pname):
"""Merge a patch from a remote branch into the current tree.
# pop to the one before the first patch to be synchronised
popped = applied[applied.index(sync_patches[0]) + 1:]
if popped:
# pop to the one before the first patch to be synchronised
popped = applied[applied.index(sync_patches[0]) + 1:]
if popped:
- pop_patches(popped[::-1])
+ pop_patches(crt_series, popped[::-1])
for p in sync_patches:
if p in popped:
# push to this patch
idx = popped.index(p) + 1
for p in sync_patches:
if p in popped:
# push to this patch
idx = popped.index(p) + 1
- push_patches(popped[:idx])
+ push_patches(crt_series, popped[:idx])
del popped[:idx]
# the actual sync
del popped[:idx]
# the actual sync
# push the remaining patches
if popped:
# push the remaining patches
if popped:
+ push_patches(crt_series, popped)
if len(args) != 0:
parser.error('cannot specify patch name with --to')
patch_nr = patchnames = None
if len(args) != 0:
parser.error('cannot specify patch name with --to')
patch_nr = patchnames = None
- to_commit = git_id(options.to)
+ to_commit = git_id(crt_series, options.to)
elif options.number:
if options.number <= 0:
parser.error('invalid value passed to --number')
elif options.number:
if options.number <= 0:
parser.error('invalid value passed to --number')
command.crt_series = Series(options.branch)
else:
command.crt_series = Series()
command.crt_series = Series(options.branch)
else:
command.crt_series = Series()
- stgit.commands.common.crt_series = command.crt_series
command.func(parser, options, args)
except (StgException, IOError, ParsingError, NoSectionError), err:
command.func(parser, options, args)
except (StgException, IOError, ParsingError, NoSectionError), err: