mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-11 21:58:41 +02:00
This was previously implemented by creating the local state dir within the global state dir (using a hash of the path in the name). This moves the |mach try again| history state to the new local state dir. It also updates the migration code to be a little more robust, ensuring we don't accidentally lose people's history. This migration should be removed at some point in the future (2020 seemed like a safe enough window). Differential Revision: https://phabricator.services.mozilla.com/D15725 --HG-- extra : moz-landing-system : lando
91 lines
2.7 KiB
Python
91 lines
2.7 KiB
Python
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
from __future__ import absolute_import, print_function, unicode_literals
|
|
|
|
import hashlib
|
|
import json
|
|
import os
|
|
import shutil
|
|
|
|
from mozboot.util import get_state_dir
|
|
|
|
from ..cli import BaseTryParser
|
|
from ..push import push_to_try, history_path, build
|
|
|
|
|
|
class AgainParser(BaseTryParser):
|
|
name = 'again'
|
|
arguments = [
|
|
[['--index'],
|
|
{'default': 0,
|
|
'type': int,
|
|
'help': "Index of entry in the history to re-push, "
|
|
"where '0' is the most recent (default 0). "
|
|
"Use --list to display indices.",
|
|
}],
|
|
[['--list'],
|
|
{'default': False,
|
|
'action': 'store_true',
|
|
'dest': 'list_configs',
|
|
'help': "Display history and exit",
|
|
}],
|
|
[['--purge'],
|
|
{'default': False,
|
|
'action': 'store_true',
|
|
'help': "Remove all history and exit",
|
|
}],
|
|
]
|
|
common_groups = ['push']
|
|
|
|
|
|
def migrate_old_history():
|
|
"""Try to move existing history files from the old locations
|
|
to the new one.
|
|
"""
|
|
old_history_dir = os.path.join(get_state_dir(), 'history')
|
|
topsrcdir_hash = hashlib.sha256(os.path.abspath(build.topsrcdir)).hexdigest()
|
|
old_history_paths = filter(os.path.isfile, [
|
|
os.path.join(old_history_dir, topsrcdir_hash, 'try_task_configs.json'),
|
|
os.path.join(old_history_dir, 'try_task_configs.json'),
|
|
])
|
|
|
|
for path in old_history_paths:
|
|
if os.path.isfile(history_path):
|
|
break
|
|
|
|
history_dir = os.path.dirname(history_path)
|
|
if not os.path.isdir(history_dir):
|
|
os.makedirs(history_dir)
|
|
|
|
shutil.move(path, history_path)
|
|
|
|
if os.path.isdir(old_history_dir):
|
|
shutil.rmtree(old_history_dir)
|
|
|
|
|
|
def run_try_again(index=0, purge=False, list_configs=False, message='{msg}', **pushargs):
|
|
# TODO: Remove after January 1st, 2020.
|
|
migrate_old_history()
|
|
|
|
if purge:
|
|
os.remove(history_path)
|
|
return
|
|
|
|
if not os.path.isfile(history_path):
|
|
print("error: history file not found: {}".format(history_path))
|
|
return 1
|
|
|
|
with open(history_path, 'r') as fh:
|
|
history = fh.readlines()
|
|
|
|
if list_configs:
|
|
for i, data in enumerate(history):
|
|
msg, config = json.loads(data)
|
|
print('{}. {}'.format(i, msg))
|
|
return
|
|
|
|
msg, try_task_config = json.loads(history[index])
|
|
return push_to_try('again', message.format(msg=msg),
|
|
try_task_config=try_task_config, **pushargs)
|