Add support for abandon/restore
Change-Id: I5f85220978c769c16405e188ae88822844a74d95
This commit is contained in:
parent
d714284593
commit
01b575d702
@ -608,6 +608,9 @@ class DatabaseSession(object):
|
|||||||
def getPendingRebases(self):
|
def getPendingRebases(self):
|
||||||
return self.session().query(Change).filter_by(pending_rebase=True).all()
|
return self.session().query(Change).filter_by(pending_rebase=True).all()
|
||||||
|
|
||||||
|
def getPendingStatusChanges(self):
|
||||||
|
return self.session().query(Change).filter_by(pending_status=True).all()
|
||||||
|
|
||||||
def getAccountByID(self, id, name=None, username=None, email=None):
|
def getAccountByID(self, id, name=None, username=None, email=None):
|
||||||
try:
|
try:
|
||||||
account = self.session().query(Account).filter_by(id=id).one()
|
account = self.session().query(Account).filter_by(id=id).one()
|
||||||
|
@ -45,6 +45,8 @@ SEARCH_RESULTS = 'search results'
|
|||||||
NEXT_CHANGE = 'next change'
|
NEXT_CHANGE = 'next change'
|
||||||
PREV_CHANGE = 'previous change'
|
PREV_CHANGE = 'previous change'
|
||||||
TOGGLE_HIDDEN_COMMENTS = 'toggle hidden comments'
|
TOGGLE_HIDDEN_COMMENTS = 'toggle hidden comments'
|
||||||
|
ABANDON_CHANGE = 'abandon change'
|
||||||
|
RESTORE_CHANGE = 'restore change'
|
||||||
REBASE_CHANGE = 'rebase change'
|
REBASE_CHANGE = 'rebase change'
|
||||||
REFRESH = 'refresh'
|
REFRESH = 'refresh'
|
||||||
EDIT_TOPIC = 'edit topic'
|
EDIT_TOPIC = 'edit topic'
|
||||||
@ -84,6 +86,8 @@ DEFAULT_KEYMAP = {
|
|||||||
NEXT_CHANGE: 'n',
|
NEXT_CHANGE: 'n',
|
||||||
PREV_CHANGE: 'p',
|
PREV_CHANGE: 'p',
|
||||||
TOGGLE_HIDDEN_COMMENTS: 't',
|
TOGGLE_HIDDEN_COMMENTS: 't',
|
||||||
|
ABANDON_CHANGE: 'ctrl a',
|
||||||
|
RESTORE_CHANGE: 'ctrl e',
|
||||||
REBASE_CHANGE: 'ctrl b',
|
REBASE_CHANGE: 'ctrl b',
|
||||||
REFRESH: 'ctrl r',
|
REFRESH: 'ctrl r',
|
||||||
EDIT_TOPIC: 'ctrl t',
|
EDIT_TOPIC: 'ctrl t',
|
||||||
|
@ -535,6 +535,8 @@ class UploadReviewsTask(Task):
|
|||||||
sync.submitTask(SetTopicTask(c.key, self.priority))
|
sync.submitTask(SetTopicTask(c.key, self.priority))
|
||||||
for c in session.getPendingRebases():
|
for c in session.getPendingRebases():
|
||||||
sync.submitTask(RebaseChangeTask(c.key, self.priority))
|
sync.submitTask(RebaseChangeTask(c.key, self.priority))
|
||||||
|
for c in session.getPendingStatusChanges():
|
||||||
|
sync.submitTask(ChangeStatusTask(c.key, self.priority))
|
||||||
for m in session.getPendingMessages():
|
for m in session.getPendingMessages():
|
||||||
sync.submitTask(UploadReviewTask(m.key, self.priority))
|
sync.submitTask(UploadReviewTask(m.key, self.priority))
|
||||||
|
|
||||||
@ -574,6 +576,33 @@ class RebaseChangeTask(Task):
|
|||||||
sync.post('changes/%s/rebase' % (change.id,), {})
|
sync.post('changes/%s/rebase' % (change.id,), {})
|
||||||
sync.submitTask(SyncChangeTask(change.id, priority=self.priority))
|
sync.submitTask(SyncChangeTask(change.id, priority=self.priority))
|
||||||
|
|
||||||
|
class ChangeStatusTask(Task):
|
||||||
|
def __init__(self, change_key, priority=NORMAL_PRIORITY):
|
||||||
|
super(ChangeStatusTask, self).__init__(priority)
|
||||||
|
self.change_key = change_key
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return '<ChangeStatusTask %s>' % (self.change_key,)
|
||||||
|
|
||||||
|
def run(self, sync):
|
||||||
|
app = sync.app
|
||||||
|
with app.db.getSession() as session:
|
||||||
|
change = session.getChange(self.change_key)
|
||||||
|
if change.pending_status_message:
|
||||||
|
data = dict(message=change.pending_status_message)
|
||||||
|
else:
|
||||||
|
data = {}
|
||||||
|
change.pending_status = False
|
||||||
|
change.pending_status_message = None
|
||||||
|
# Inside db session for rollback
|
||||||
|
if change.status == 'ABANDONED':
|
||||||
|
sync.post('changes/%s/abandon' % (change.id,),
|
||||||
|
data)
|
||||||
|
elif change.status == 'NEW':
|
||||||
|
sync.post('changes/%s/restore' % (change.id,),
|
||||||
|
data)
|
||||||
|
sync.submitTask(SyncChangeTask(change.id, priority=self.priority))
|
||||||
|
|
||||||
class UploadReviewTask(Task):
|
class UploadReviewTask(Task):
|
||||||
def __init__(self, message_key, priority=NORMAL_PRIORITY):
|
def __init__(self, message_key, priority=NORMAL_PRIORITY):
|
||||||
super(UploadReviewTask, self).__init__(priority)
|
super(UploadReviewTask, self).__init__(priority)
|
||||||
|
@ -50,6 +50,29 @@ class EditTopicDialog(mywid.ButtonDialog):
|
|||||||
return None
|
return None
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
class AbandonRestoreDialog(urwid.WidgetWrap):
|
||||||
|
signals = ['save', 'cancel']
|
||||||
|
def __init__(self, action, text):
|
||||||
|
self.action = action
|
||||||
|
save_button = mywid.FixedButton(action)
|
||||||
|
cancel_button = mywid.FixedButton('Cancel')
|
||||||
|
urwid.connect_signal(save_button, 'click',
|
||||||
|
lambda button:self._emit('save'))
|
||||||
|
urwid.connect_signal(cancel_button, 'click',
|
||||||
|
lambda button:self._emit('cancel'))
|
||||||
|
button_widgets = [('pack', save_button),
|
||||||
|
('pack', cancel_button)]
|
||||||
|
button_columns = urwid.Columns(button_widgets, dividechars=2)
|
||||||
|
rows = []
|
||||||
|
self.entry = urwid.Edit(edit_text=text, multiline=True)
|
||||||
|
rows.append(urwid.Text(u"%s message: " % action))
|
||||||
|
rows.append(self.entry)
|
||||||
|
rows.append(urwid.Divider())
|
||||||
|
rows.append(button_columns)
|
||||||
|
pile = urwid.Pile(rows)
|
||||||
|
fill = urwid.Filler(pile, valign='top')
|
||||||
|
super(AbandonRestoreDialog, self).__init__(urwid.LineBox(fill, '%s Change' % (action,)))
|
||||||
|
|
||||||
class ReviewDialog(urwid.WidgetWrap):
|
class ReviewDialog(urwid.WidgetWrap):
|
||||||
signals = ['save', 'cancel']
|
signals = ['save', 'cancel']
|
||||||
def __init__(self, revision_row):
|
def __init__(self, revision_row):
|
||||||
@ -345,8 +368,12 @@ class ChangeView(urwid.WidgetWrap):
|
|||||||
"Toggle the reviewed flag for the current change"),
|
"Toggle the reviewed flag for the current change"),
|
||||||
(key(keymap.CHERRY_PICK),
|
(key(keymap.CHERRY_PICK),
|
||||||
"Cherry-pick the most recent revision onto the local repo"),
|
"Cherry-pick the most recent revision onto the local repo"),
|
||||||
|
(key(keymap.ABANDON_CHANGE),
|
||||||
|
"Abandon this change"),
|
||||||
(key(keymap.REBASE_CHANGE),
|
(key(keymap.REBASE_CHANGE),
|
||||||
"Rebase this change (remotely)"),
|
"Rebase this change (remotely)"),
|
||||||
|
(key(keymap.RESTORE_CHANGE),
|
||||||
|
"Restore this change"),
|
||||||
(key(keymap.REFRESH),
|
(key(keymap.REFRESH),
|
||||||
"Refresh this change"),
|
"Refresh this change"),
|
||||||
(key(keymap.EDIT_TOPIC),
|
(key(keymap.EDIT_TOPIC),
|
||||||
@ -448,6 +475,7 @@ class ChangeView(urwid.WidgetWrap):
|
|||||||
with self.app.db.getSession() as session:
|
with self.app.db.getSession() as session:
|
||||||
change = session.getChange(self.change_key)
|
change = session.getChange(self.change_key)
|
||||||
self.topic = change.topic or ''
|
self.topic = change.topic or ''
|
||||||
|
self.pending_status_message = change.pending_status_message or ''
|
||||||
if change.reviewed:
|
if change.reviewed:
|
||||||
reviewed = ' (reviewed)'
|
reviewed = ' (reviewed)'
|
||||||
else:
|
else:
|
||||||
@ -717,9 +745,15 @@ class ChangeView(urwid.WidgetWrap):
|
|||||||
self.hide_comments = not self.hide_comments
|
self.hide_comments = not self.hide_comments
|
||||||
self.refresh()
|
self.refresh()
|
||||||
return None
|
return None
|
||||||
|
if keymap.ABANDON_CHANGE in commands:
|
||||||
|
self.abandonChange()
|
||||||
|
return None
|
||||||
if keymap.REBASE_CHANGE in commands:
|
if keymap.REBASE_CHANGE in commands:
|
||||||
self.rebaseChange()
|
self.rebaseChange()
|
||||||
return None
|
return None
|
||||||
|
if keymap.RESTORE_CHANGE in commands:
|
||||||
|
self.restoreChange()
|
||||||
|
return None
|
||||||
if keymap.REFRESH in commands:
|
if keymap.REFRESH in commands:
|
||||||
self.app.sync.submitTask(
|
self.app.sync.submitTask(
|
||||||
sync.SyncChangeTask(self.change_rest_id, priority=sync.HIGH_PRIORITY))
|
sync.SyncChangeTask(self.change_rest_id, priority=sync.HIGH_PRIORITY))
|
||||||
@ -740,6 +774,33 @@ class ChangeView(urwid.WidgetWrap):
|
|||||||
screen = view_side_diff.SideDiffView(self.app, revision_key)
|
screen = view_side_diff.SideDiffView(self.app, revision_key)
|
||||||
self.app.changeScreen(screen)
|
self.app.changeScreen(screen)
|
||||||
|
|
||||||
|
def abandonChange(self):
|
||||||
|
dialog = AbandonRestoreDialog(u'Abandon', self.pending_status_message)
|
||||||
|
urwid.connect_signal(dialog, 'cancel', self.app.backScreen)
|
||||||
|
urwid.connect_signal(dialog, 'save', lambda button:
|
||||||
|
self.doAbandonRestoreChange(dialog, 'ABANDONED'))
|
||||||
|
self.app.popup(dialog)
|
||||||
|
|
||||||
|
def restoreChange(self):
|
||||||
|
dialog = AbandonRestoreDialog(u'Restore', self.pending_status_message)
|
||||||
|
urwid.connect_signal(dialog, 'cancel', self.app.backScreen)
|
||||||
|
urwid.connect_signal(dialog, 'save', lambda button:
|
||||||
|
self.doAbandonRestoreChange(dialog, 'NEW'))
|
||||||
|
self.app.popup(dialog)
|
||||||
|
|
||||||
|
def doAbandonRestoreChange(self, dialog, state):
|
||||||
|
change_key = None
|
||||||
|
with self.app.db.getSession() as session:
|
||||||
|
change = session.getChange(self.change_key)
|
||||||
|
change.status = state
|
||||||
|
change.pending_status = True
|
||||||
|
change.pending_status_message = dialog.entry.edit_text
|
||||||
|
change_key = change.key
|
||||||
|
self.app.sync.submitTask(
|
||||||
|
sync.ChangeStatusTask(change_key, sync.HIGH_PRIORITY))
|
||||||
|
self.app.backScreen()
|
||||||
|
self.refresh()
|
||||||
|
|
||||||
def rebaseChange(self):
|
def rebaseChange(self):
|
||||||
dialog = mywid.YesNoDialog(u'Rebase Change',
|
dialog = mywid.YesNoDialog(u'Rebase Change',
|
||||||
u'Perform a remote rebase of this change?')
|
u'Perform a remote rebase of this change?')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user