!update: Don't restart the bot if already up-to-date

This commit is contained in:
nyuszika7h 2016-11-16 14:47:56 +01:00
parent abd2dd149d
commit 82d6760c5a
2 changed files with 45 additions and 19 deletions

View File

@ -768,6 +768,7 @@
"no_such_role": "No such role: {0}",
"available_modes": "Available game modes: \u0002",
"process_exited": "Process {0} exited with {1} {2}",
"already_up_to_date": "Already up-to-date.",
"admin_fleave_deadchat": "You have forced {0} to leave the deadchat.",
"available_mode_setters_help": "Votes to make a specific game mode more likely. Available game mode setters: ",
"fspectate_help": "Usage: fspectate <wolfchat|deadchat> [on|off]",

View File

@ -7207,31 +7207,54 @@ def vote(cli, nick, chan, rest):
else:
return show_votes.caller(cli, nick, chan, rest)
def _call_command(cli, nick, chan, command, no_out=False):
"""
Executes a system command.
If `no_out` is True, the command's output will not be sent to IRC,
unless the exit code is non-zero.
"""
child = subprocess.Popen(command.split(),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
(out, err) = child.communicate()
ret = child.returncode
if not (no_out and ret == 0):
for line in (out + err).splitlines():
reply(cli, nick, chan, line.decode("utf-8"), private=True)
if ret != 0:
if ret < 0:
cause = "signal"
ret *= -1
else:
cause = "status"
reply(cli, nick, chan, messages["process_exited"].format(command, cause, ret), private=True)
return (ret, out)
@cmd("pull", "fpull", flag="D", pm=True)
def fpull(cli, nick, chan, rest):
"""Pulls from the repository to update the bot."""
commands = ["git fetch",
"git rebase --stat --preserve-merges"]
(ret, _) = _call_command(cli, nick, chan, "git fetch")
for command in commands:
child = subprocess.Popen(command.split(),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
(out, err) = child.communicate()
ret = child.returncode
if ret != 0:
return False
for line in (out + err).splitlines():
reply(cli, nick, chan, line.decode("utf-8"), private=True)
(_, out) = _call_command(cli, nick, chan, "git status -b --porcelain", no_out=True)
if ret != 0:
if ret < 0:
cause = "signal"
ret *= -1
else:
cause = "status"
if not re.search(rb"behind \d+", out.splitlines()[0]):
# Already up-to-date
reply(cli, nick, chan, messages["already_up_to_date"], private=True)
return False
reply(cli, nick, chan, messages["process_exited"].format(command, cause, ret), private=True)
(ret, _) = _call_command(cli, nick, chan, "git rebase --stat --preserve-merges")
return (ret == 0)
@cmd("update", flag="D", pm=True)
def update(cli, nick, chan, rest):
@ -7251,8 +7274,10 @@ def update(cli, nick, chan, rest):
# Display "Scheduled restart" instead of "Forced restart" when called with !faftergame
restart_program.aftergame = True
fpull.caller(cli, nick, chan, "")
restart_program.caller(cli, nick, chan, "Updating bot")
ret = fpull.caller(cli, nick, chan, "")
if ret:
restart_program.caller(cli, nick, chan, "Updating bot")
@cmd("send", "fsend", flag="F", pm=True)
def fsend(cli, nick, chan, rest):