def showsyncstatus(repo, ctx, templ, **args): """String. Return whether the local revision is in sync with the remote (phabricator) revision """ diffnum = getdiffnum(repo, ctx) if diffnum is None: return None populateresponseforphab(repo, diffnum) results = getdiffstatus(repo, diffnum) try: result = results[0] remote = result["hash"] status = result["status"] count = int(result["count"]) except (IndexError, KeyError, ValueError, TypeError): # We got no result back, or it did not contain all required fields return "Error" local = ctx.hex() if local == remote: return "sync" elif count == 1: precursors = list(obsutil.allpredecessors(repo.obsstore, [ctx.node()])) hashes = [repo[h].hex() for h in precursors if h in repo] # hashes[0] is the current # hashes[1] is the previous if len(hashes) > 1 and hashes[1] == remote: return "sync" else: return "unsync" elif status == "Committed": return "committed" else: return "unsync"
def smarthide(repo, revhide, revshow, local=False): """hides changecontexts and reveals some commits tries to connect related hides and shows with obs marker when reasonable and correct use local to not hide revhides without corresponding revshows """ hidectxs = repo.set(revhide) showctxs = repo.set(revshow) markers = [] nodes = [] for ctx in hidectxs: unfi = repo.unfiltered() related = set() if mutation.enabled(unfi): related.update(mutation.allpredecessors(unfi, [ctx.node()])) related.update(mutation.allsuccessors(unfi, [ctx.node()])) else: related.update(obsutil.allpredecessors(unfi.obsstore, [ctx.node()])) related.update(obsutil.allsuccessors(unfi.obsstore, [ctx.node()])) related.intersection_update(x.node() for x in showctxs) destinations = [repo[x] for x in related] # two primary objectives: # 1. correct divergence/nondivergence # 2. correct visibility of changesets for the user # secondary objectives: # 3. useful ui message in hg sl: "Undone to" # Design choices: # 1-to-1 correspondence is easy # 1-to-many correspondence is hard: # it's either divergent A to B, A to C # or split A to B,C # because of undo we don't know which # without complex logic # Solution: provide helpful ui message for # common and easy case (1 to 1), use simplest # correct solution for complex edge case if len(destinations) == 1: markers.append((ctx, destinations)) nodes.append(ctx.node()) elif len(destinations) > 1: # split markers.append((ctx, [])) nodes.append(ctx.node()) elif len(destinations) == 0: if not local: markers.append((ctx, [])) nodes.append(ctx.node()) if obsolete.isenabled(repo, obsolete.createmarkersopt): obsolete.createmarkers(repo, markers, operation="undo") visibility.remove(repo, nodes)