mirror of
https://github.com/facebook/sapling.git
synced 2024-10-06 23:07:18 +03:00
732d512647
Summary:
Historically, we avoided running the Black autoformatter on our
fork of ghstack so that the code would be easier to diff with
upstream. Now that Black is run on upstream ghstack:
e5eca89cb3
we have no reason to exclude it from our linter.
Going forward, we should update the GitHub CI to run `black --check`
and report back so that contributors get this signal as well.
Reviewed By: zsol
Differential Revision: D42494629
fbshipit-source-id: 7f09ec46f687e56662f4f6ac477fd2fd077709d6
119 lines
3.6 KiB
Python
119 lines
3.6 KiB
Python
import datetime
|
|
import os
|
|
import tempfile
|
|
from typing import Dict, NewType
|
|
|
|
import ghstack
|
|
import ghstack.logs
|
|
|
|
RawIndex = NewType("RawIndex", int)
|
|
FilteredIndex = NewType("FilteredIndex", int)
|
|
|
|
|
|
def get_argv(log_dir: str) -> str:
|
|
argv = "Unknown"
|
|
argv_fn = os.path.join(log_dir, "argv")
|
|
if os.path.exists(argv_fn):
|
|
with open(argv_fn, "r") as f:
|
|
argv = f.read().rstrip()
|
|
return argv
|
|
|
|
|
|
def get_status(log_dir: str) -> str:
|
|
status = ""
|
|
status_fn = os.path.join(log_dir, "status")
|
|
if os.path.exists(status_fn):
|
|
with open(status_fn, "r") as f:
|
|
status = f.read().rstrip()
|
|
return status
|
|
|
|
|
|
def main(latest: bool = False) -> None:
|
|
|
|
log_base = ghstack.logs.base_dir()
|
|
logs = os.listdir(log_base)
|
|
logs.sort(reverse=True)
|
|
|
|
filtered_mapping: Dict[FilteredIndex, RawIndex] = {}
|
|
|
|
selected_index: FilteredIndex = FilteredIndex(0)
|
|
next_index: FilteredIndex = FilteredIndex(0)
|
|
if not latest:
|
|
print("Which invocation would you like to report?")
|
|
print()
|
|
for (i, fn) in enumerate(logs):
|
|
if next_index > 10:
|
|
break
|
|
|
|
raw_index = RawIndex(i)
|
|
log_dir = os.path.join(log_base, fn)
|
|
|
|
# Filter out rage
|
|
# NB: This doesn't have to be 100% sound; just need to be
|
|
# enough to good enough to filter out the majority of cases
|
|
argv = get_argv(log_dir)
|
|
argv_list = argv.split()
|
|
|
|
if len(argv_list) >= 2 and argv_list[1] == "rage":
|
|
continue
|
|
|
|
if len(argv_list) >= 1:
|
|
argv_list[0] = os.path.basename(argv_list[0])
|
|
|
|
argv = " ".join(argv_list)
|
|
|
|
status = get_status(log_dir)
|
|
if status:
|
|
at_status = " at {}".format(status)
|
|
else:
|
|
at_status = ""
|
|
|
|
cur_index = next_index
|
|
next_index = FilteredIndex(next_index + 1)
|
|
|
|
filtered_mapping[cur_index] = raw_index
|
|
|
|
m = ghstack.logs.RE_LOG_DIRNAME.fullmatch(fn)
|
|
if m:
|
|
date = (
|
|
datetime.datetime.strptime(m.group(1), ghstack.logs.DATETIME_FORMAT)
|
|
.astimezone(tz=None)
|
|
.strftime("%a %b %d %H:%M:%S %Z")
|
|
)
|
|
else:
|
|
date = "Unknown"
|
|
exception = "Succeeded"
|
|
exception_fn = os.path.join(log_base, fn, "exception")
|
|
if os.path.exists(exception_fn):
|
|
with open(exception_fn, "r") as f:
|
|
exception = "Failed with: " + f.read().rstrip()
|
|
|
|
print(
|
|
"{:<5} {} [{}] {}{}".format(
|
|
"[{}].".format(cur_index), date, argv, exception, at_status
|
|
)
|
|
)
|
|
print()
|
|
selected_index = FilteredIndex(
|
|
int(input("(input individual number, for example 1 or 2)\n"))
|
|
)
|
|
|
|
log_dir = os.path.join(log_base, logs[filtered_mapping[selected_index]])
|
|
|
|
print()
|
|
print("Writing report, please wait...")
|
|
with tempfile.NamedTemporaryFile(
|
|
mode="w", suffix=".log", prefix="ghstack", delete=False
|
|
) as g:
|
|
g.write("version: {}\n".format(ghstack.__version__))
|
|
g.write("command: {}\n".format(get_argv(log_dir)))
|
|
g.write("status: {}\n".format(get_status(log_dir)))
|
|
g.write("\n")
|
|
log_fn = os.path.join(log_dir, "ghstack.log")
|
|
if os.path.exists(log_fn):
|
|
with open(log_fn) as log:
|
|
g.write(log.read())
|
|
|
|
print("=> Report written to {}".format(g.name))
|
|
print("Please include this log with your bug report!")
|