import sys
import git
import manim as m
import numpy
from git_sim.git_sim_base_command import GitSimBaseCommand
from git_sim.settings import settings
class Revert(GitSimBaseCommand):
def __init__(self, commit: str):
super().__init__()
self.commit = commit
try:
self.revert = git.repo.fun.rev_parse(self.repo, self.commit)
except git.exc.BadName:
print(
"git-sim error: '"
+ self.commit
+ "' is not a valid Git ref or identifier."
)
sys.exit(1)
self.n_default = 4
self.n = self.n_default
settings.hide_merged_branches = True
self.zone_title_offset += 0.1
try:
self.selected_branches.append(self.repo.active_branch.name)
except TypeError:
pass
self.cmd += f"{type(self).__name__.lower()} {self.commit}"
def construct(self):
if not settings.stdout and not settings.output_only_path and not settings.quiet:
print(f"{settings.INFO_STRING} {self.cmd}")
self.show_intro()
self.parse_commits()
self.center_frame_on_commit(self.get_commit())
self.setup_and_draw_revert_commit()
self.recenter_frame()
self.scale_frame()
self.reset_head_branch("abcdef")
self.vsplit_frame()
self.setup_and_draw_zones(
first_column_name="----",
second_column_name="Changes reverted from",
third_column_name="----",
)
self.show_command_as_title()
self.fadeout()
self.show_outro()
def build_commit_id_and_message(self, commit, i):
hide_refs = False
if commit == "dark":
commitId = m.Text("", font=self.font, font_size=20, color=self.fontColor)
commitMessage = ""
elif i == 2 and self.revert.hexsha not in [
commit.hexsha for commit in self.get_default_commits()
]:
commitId = m.Text("...", font=self.font, font_size=20, color=self.fontColor)
commitMessage = "..."
hide_refs = True
elif i == 3 and self.revert.hexsha not in [
commit.hexsha for commit in self.get_default_commits()
]:
commitId = m.Text(
self.revert.hexsha[:6],
font=self.font,
font_size=20,
color=self.fontColor,
)
commitMessage = self.revert.message.split("\n")[0][:40].replace("\n", " ")
hide_refs = True
else:
commitId = m.Text(
commit.hexsha[:6],
font=self.font,
font_size=20,
color=self.fontColor,
)
commitMessage = commit.message.split("\n")[0][:40].replace("\n", " ")
return commitId, commitMessage, commit, hide_refs
def setup_and_draw_revert_commit(self):
circle = m.Circle(
stroke_color=m.RED,
stroke_width=self.commit_stroke_width,
fill_color=m.RED,
fill_opacity=0.25,
)
circle.height = 1
circle.next_to(
self.drawnCommits[self.get_commit().hexsha],
m.LEFT if settings.reverse else m.RIGHT,
buff=1.5,
)
start = circle.get_center()
end = self.drawnCommits[self.get_commit().hexsha].get_center()
arrow = m.Arrow(
start,
end,
color=self.fontColor,
stroke_width=self.arrow_stroke_width,
tip_shape=self.arrow_tip_shape,
max_stroke_width_to_length_ratio=1000,
)
length = numpy.linalg.norm(start - end) - (1.5 if start[1] == end[1] else 3)
arrow.set_length(length)
commitId = m.Text(
"abcdef", font=self.font, font_size=20, color=self.fontColor
).next_to(circle, m.UP)
self.toFadeOut.add(commitId)
commitMessage = "Revert " + self.revert.hexsha[0:6]
commitMessage = commitMessage[:40].replace("\n", " ")
message = m.Text(
"\n".join(
commitMessage[j : j + 20] for j in range(0, len(commitMessage), 20)
)[:100],
font=self.font,
font_size=14,
color=self.fontColor,
).next_to(circle, m.DOWN)
self.toFadeOut.add(message)
if settings.animate:
self.play(
self.camera.frame.animate.move_to(circle.get_center()),
m.Create(circle),
m.AddTextLetterByLetter(commitId),
m.AddTextLetterByLetter(message),
run_time=1 / settings.speed,
)
else:
self.camera.frame.move_to(circle.get_center())
self.add(circle, commitId, message)
self.drawnCommits["abcdef"] = circle
self.toFadeOut.add(circle)
if settings.animate:
self.play(m.Create(arrow), run_time=1 / settings.speed)
else:
self.add(arrow)
self.toFadeOut.add(arrow)
def populate_zones(
self,
firstColumnFileNames,
secondColumnFileNames,
thirdColumnFileNames,
firstColumnArrowMap={},
secondColumnArrowMap={},
thirdColumnArrowMap={},
):
for filename in self.revert.stats.files:
secondColumnFileNames.add(filename)