@@ -1,5 +1,6 @@
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ import contextlib
1 2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
import re
2 3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
3 4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
import markdown as md
4 5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
from django.contrib.auth.decorators import login_required
5 6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
from django.http import Http404
@@ -885,10 +886,91 @@
885 886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
request,
886 887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"fossil/technote_list.html",
887 888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{"project": project, "notes": notes, "active_tab": "wiki"},
888 889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
)
889 890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # --- Compare Checkins ---
893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @login_required
896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def compare_checkins(request, slug):
897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Compare two checkins side by side."""
898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ P.PROJECT_VIEW.check(request.user)
899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ project, fossil_repo, reader = _get_repo_and_reader(slug)
900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from_uuid = request.GET.get("from", "")
902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to_uuid = request.GET.get("to", "")
903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from_detail = None
905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to_detail = None
906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ file_diffs = []
907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if from_uuid and to_uuid:
909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with reader:
910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from_detail = reader.get_checkin_detail(from_uuid)
911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to_detail = reader.get_checkin_detail(to_uuid)
912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if from_detail and to_detail:
914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Get all files from both checkins and compute diffs
915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from_files = {f["name"]: f for f in from_detail.files_changed}
916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to_files = {f["name"]: f for f in to_detail.files_changed}
917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ all_files = sorted(set(list(from_files.keys()) + list(to_files.keys())))
918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ import difflib
920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for fname in all_files[:20]: # Limit to 20 files for performance
922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ old_text = ""
923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ new_text = ""
924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ f_from = from_files.get(fname, {})
925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ f_to = to_files.get(fname, {})
926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if f_from.get("uuid"):
928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with contextlib.suppress(Exception):
929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ old_text = reader.get_file_content(f_from["uuid"]).decode("utf-8", errors="replace")
930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if f_to.get("uuid"):
931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with contextlib.suppress(Exception):
932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ new_text = reader.get_file_content(f_to["uuid"]).decode("utf-8", errors="replace")
933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if old_text != new_text:
935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ diff = difflib.unified_diff(
936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ old_text.splitlines(keepends=True),
937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ new_text.splitlines(keepends=True),
938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fromfile=f"a/{fname}",
939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tofile=f"b/{fname}",
940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ n=3,
941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ diff_lines = []
943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for line in diff:
944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ line_type = "context"
945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if line.startswith("+++") or line.startswith("---"):
946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ line_type = "header"
947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ elif line.startswith("@@"):
948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ line_type = "hunk"
949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ elif line.startswith("+"):
950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ line_type = "add"
951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ elif line.startswith("-"):
952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ line_type = "del"
953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ diff_lines.append({"text": line, "type": line_type})
954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if diff_lines:
956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ file_diffs.append({"name": fname, "diff_lines": diff_lines})
957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return render(
959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ request,
960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "fossil/compare.html",
961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {
962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "project": project,
963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "from_uuid": from_uuid,
964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "to_uuid": to_uuid,
965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "from_detail": from_detail,
966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "to_detail": to_detail,
967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "file_diffs": file_diffs,
968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "active_tab": "timeline",
969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
890 972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
891 973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# --- Search ---
892 974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
893 975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
894 976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@login_required
895 977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
896 978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
A DDED templates/fossil/compare.html