Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
"-p", self.base_commit,
input='Update base for {} on "{}"\n\n{}\n\n[ghstack-poisoned]'
.format(self.msg, elab_commit.title,
non_orig_commit_msg)))
base_args = ("-p", new_base)
# Blast our current tree as the newest commit, merging
# against the previous pull entry, and the newest base.
tree = commit.patch.apply(self.sh, self.base_tree)
# Nothing to do, just ignore the diff
if tree == self.base_tree:
self.ignored_diffs.append((commit, number))
logging.warn("Skipping PR #{} {}, as the commit now has no changes"
.format(number, elab_commit.title))
return
new_pull = GitCommitHash(self.sh.git(
"commit-tree", tree,
"-p", "origin/" + branch_head(self.username, ghnum),
*base_args,
input='{} on "{}"\n\n{}\n\n[ghstack-poisoned]'.format(self.msg, elab_commit.title, non_orig_commit_msg)))
# Perform what is effectively an interactive rebase
# on the orig branch.
#
# Hypothetically, there could be a case when this isn't
# necessary, but it's INCREDIBLY unlikely (because we'd
# have to look EXACTLY like the original orig, and since
# we're in the branch that says "hey we changed
# multiple machines (you bad bad)
refs = self.sh.git(
"for-each-ref",
"refs/remotes/origin/gh/{}".format(self.username),
"--format=%(refname)").split()
max_ref_num = max(int(ref.split('/')[-2]) for ref in refs) \
if refs else 0
ghnum = GhNumber(str(max_ref_num + 1))
# Create the incremental pull request diff
tree = commit.patch.apply(self.sh, self.base_tree)
# Actually, if there's no change in the tree, stop processing
if tree == self.base_tree:
self.ignored_diffs.append((commit, None))
logging.warn("Skipping {} {}, as the commit has no changes"
.format(commit.oid, title))
return
assert ghnum not in self.seen_ghnums
self.seen_ghnums.add(ghnum)
new_pull = GitCommitHash(
self.sh.git("commit-tree", tree,
"-p", self.base_commit,
input=commit.summary + "\n\n[ghstack-poisoned]"))
# Push the branches, so that we can create a PR for them
new_branches = (
push_spec(new_pull, branch_head(self.username, ghnum)),
push_spec(self.base_commit, branch_base(self.username, ghnum))
)
def manager(*, debug: bool = False) -> Iterator[None]:
# TCB code to setup logging. If a failure starts here we won't
# be able to save the user ina reasonable way.
# Logging structure: there is one logger (the root logger)
# and in processes all events. There are two handlers:
# stderr (INFO) and file handler (DEBUG).
root_logger = logging.getLogger()
root_logger.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
if debug:
console_handler.setLevel(logging.DEBUG)
else:
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(formatter)
root_logger.addHandler(console_handler)
log_file = os.path.join(run_dir(), "ghstack.log")
file_handler = logging.FileHandler(log_file)
# TODO: Hypothetically, it is better if we log the timestamp.
# But I personally feel the timestamps gunk up the log info
# for not much benefit (since we're not really going to be
# in the business of debugging performance bugs, for which
# timestamps would really be helpful.) Perhaps reconsider
# at some point based on how useful this information actually is.
status = subparsers.add_parser('status')
# TODO: support number as well
status.add_argument('pull_request', metavar='PR',
help='GitHub pull request URL to perform action on')
args = parser.parse_args()
if args.version:
print("ghstack {}".format(ghstack.__version__))
return
if args.cmd is None:
args.cmd = 'submit'
with ghstack.logging.manager(debug=args.debug):
sh = ghstack.shell.Shell()
conf = ghstack.config.read_config()
ghstack.logging.formatter.redact(conf.github_oauth, '')
github = ghstack.github_real.RealGitHubEndpoint(
oauth_token=conf.github_oauth,
proxy=conf.proxy
)
if args.cmd == 'rage':
ghstack.rage.main(latest=args.latest)
elif args.cmd == 'submit':
ghstack.submit.main(
msg=args.message,
username=conf.github_username,
sh=sh,
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.logging.RE_LOG_DIRNAME.fullmatch(fn)
if m:
date = datetime.datetime.strptime(
m.group(1), ghstack.logging.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]])