Skip to content

🚀 Feature: מימוש דפדפן היסטוריית Git ותצוגת Diff מתקדמת #2914

Description

@amirbiron

🚀 Feature: מימוש דפדפן היסטוריית Git ותצוגת Diff מתקדמת

📝 תיאור כללי

הוספת יכולות צפייה בהיסטוריית גרסאות (Git Log), צפייה בקבצים ב-Commit ספציפי, והשוואת גרסאות (Diff) ישירות מתוך דפדפן הקוד ב-Web App.
המימוש מתבסס על הארכיטקטורה שהוגדרה, כולל טיפול בקבצים בינאריים, תמיכה ב-RTL, וביצועים (Pagination ו-Lazy Loading).


🏗 ארכיטקטורה ו-API

Endpoints חדשים (Backend)

  • GET /repo/api/history - שליפת רשימת Commits (תומך ב-Pagination).
  • GET /repo/api/file-at-commit/<commit> - צפייה בתוכן קובץ בנקודת זמן.
  • GET /repo/api/diff/<commit1>/<commit2> - השוואה בין שתי גרסאות.
  • GET /repo/api/commit/<commit> - מטא-דאטה של Commit בודד.

שינויים בתשתית

  • שימוש ב-subprocess להרצת פקודות Git בצורה מאובטחת.
  • העברת file_path כ-Query Parameter (?file=...) למניעת בעיות URL Encoding.
  • מנגנון זיהוי קבצים בינאריים (NUL Byte Detection).

✅ רשימת משימות (Checklist)

1. Backend (git_mirror_service.py)

  • הוספת import subprocess וקבועים (MAX_DIFF_BYTES, MAX_FILE_SIZE).
  • מימוש _validate_ref_with_git לוולידציה חזקה של SHA/Branch.
  • מימוש _detect_binary_content ו-_try_decode_content.
  • מימוש get_file_history עם תמיכה ב---follow (לזיהוי Renames).
  • מימוש get_file_at_commit כולל הגבלת גודל קובץ.
  • מימוש get_diff עם לוגיקת Truncation לקבצים גדולים.
  • מימוש _parse_diff לתמיכה בפורמט JSON מובנה (כולל Renames/Copies).

2. API Routes (repo_browser.py)

  • יצירת Routes חדשים תחת repo_bp.
  • הוספת וולידציה לקלט (Repo name, File path).
  • שימוש ב-unquote לטיפול בנתיבי קבצים שמגיעים ב-Query String.
  • טיפול בשגיאות והחזרת קודי HTTP מתאימים (400, 404, 413, 500).

3. Frontend (JS & CSS)

  • יצירת קובץ repo-history.js (מודול RepoHistory).
  • מימוש פאנל צד (Slide-over) להצגת רשימת Commits.
  • מימוש Compare Mode (ממשק לבחירת שני Commits להשוואה).
  • מימוש מודאל Diff עם תצוגה צבעונית (Unified View).
  • עדכון repo-browser.js להוספת כפתור "היסטוריה" ב-Header של הקובץ.
  • הוספת CSS מתאים עם תמיכה מלאה ב-RTL/LTR.

4. אבטחה וביצועים

  • ווידוא שאין אפשרות ל-Path Traversal (..) בנתיבי קבצים.
  • סניטציה של פלט Git (הסרת Tokens/Passwords אם דלפו ללוג).
  • הגבלת גודל ה-Diff המוחזר (Default: 1MB).

⚠️ דגשים טכניים חשובים

  1. URL Encoding: שים לב שנתיבי קבצים מועברים כעת ב-Query String ולא כחלק מה-URL Path, כדי למנוע שגיאות 404 בקבצים המכילים / או תווים מיוחדים.
  2. Binary Files: המערכת חייבת לזהות קבצים בינאריים ולהימנע מניסיון להציג Diff טקסטואלי עבורם.
  3. Encoding: יש לתמוך ב-Fallback ל-utf-8-sig, latin-1 ו-cp1255 (עברית) אם UTF-8 נכשל.

🔒 דרישת מימוש 1:1

חובה להצמד במדויק למדריך המצורף

כללים:

  • מימוש מלא: אל תקצר חלקים שמוצעים במדריך
  • אם חייב לסטות: תעצור ותתעד ב-"Delta מהמדריך" (מקסימום 5 דלתאות)

המדריך

Activity

  1. amirbiron commented on Jan 23, 2026

    @amirbiron
    OwnerAuthor

    @cursoragent

    תוכל לממש?

    🔒 דרישת מימוש 1:1

    חובה להצמד במדויק למדריך המצורף

    כללים:

    • מימוש מלא: אל תקצר חלקים שמוצעים במדריך
    • אם חייב לסטות: תעצור ותתעד ב-"Delta מהמדריך" (מקסימום 5 דלתאות)
  2. cursor commented on Jan 23, 2026

    @cursor
    Contributor

    בטח. מימשתי לפי המדריך, כולל Backend, Routes, Frontend ו‑Tests.

    סיכום קצר מה שעשיתי

    • הוספתי ל‑git_mirror_service.py את כל היכולות: ולידציות, זיהוי בינארי, קידוד, היסטוריה, diff, truncation ו‑parser.
    • יצרתי routes חדשים ב‑repo_browser.py עם טיפול שגיאות וקידודי query param.
    • הוספתי את repo-history.js, פאנל היסטוריה, Compare Mode, מודאל diff, ועדכוני CSS/Template.
    • הוספתי בדיקות Python וגם בדיקות JS לפי המדריך.

    בדיקות

    • לא הרצתי בדיקות (לא התבקשתי).

    Delta מהמדריך (מקסימום 5)

    1. רישום git_mirror_service נעשה עצל דרך get_git_service() (fallback) ולא ב‑app.py, כדי להימנע מתופעות לוואי בזמן import/tests.
    2. ב‑UI שמרתי את ה‑breadcrumbs והפעולות הקיימות: הוספתי <div class="file-header"> במקום להחליף את כל ה‑header, והסרתי את כפתור “Copy content” הישן כדי למנוע כפילות.
    3. הוספתי adapter ב‑window.RepoState כדי לתמוך גם ב‑CodeMirror 6 בעת טעינה של קובץ מ‑commit.

    אם תרצה, אני יכול גם ליישר את דלתא #1 ולהוסיף רישום מפורש ב‑app.py בצורה בטוחה.

    ובסיום — תרצה שאוסיף עמוד/ים חדשים לאתר התיעוד על היסטוריית Git וה‑Diff Viewer?

    View PR
    Open in Cursor Open in Web

  3. amirbiron commented on Jan 23, 2026

    @amirbiron
    OwnerAuthor

    @cursoragent

    אחרי השדרוג של דפדפן הריפו להציג היסטוריה - השתנתה התצוגה של שם ונתיב הקובץ -
    מופיע עכשיו למשל ככה - webapp/templates/repo/base_repo.html base_repo.html

    א. אז דבר ראשון יש כפילות, עכשיו החלק שמופיע ככה מיותר -
    "

    1. webapp
    2. templates/
    3. repo
    4. base_repo.html
      "

    ב. דבר שני, בקטע הזה - webapp/templates/repo/base_repo.html base_repo.html - גם נראה שהחלק הזה מיותר - "base_repo.html"

    ג. דבר שלישי, נראה שיחסוך במקום אם כפתור "הסטוריה" יעבור לאותה שורה של webapp/templates/repo/base_repo.html במקום כמו עכשיו שמופיע בשורה מתחת

    ד. נראה שכפתור "העתק" החדש הוא בעיצוב לא הכי מתאים, אולי כדאי להחזיר את העיצוב של כפתור "העתק" הקודם שהסרנו במימוש של השידרוג

    ה. בחיפוש הגלובלי כשמתחילים לרשום את מילות החיפוש - זה כבר מתחיל לחפש מייד עם האות הראשונה, ועם כל הוספת אותו - זה שוב מחפש - נראה שזה קצת מאט/תוקע את התהליך, אולי עדיף שהחיפוש יתבצע רק אחרי לחיצה על כפתור אנטר

    ו. המודאל של התוצאות חיפוש הגלובלי שנפתח - מסתיר את שורת החיפוש - וקשה לערוך שנית את שדה החיפוש

  4. cursor commented on Jan 23, 2026

    @cursor
    Contributor

    סידרתי את כל הסעיפים שביקשת:

    מה השתנה

    • הסרתי את כפילות ה־breadcrumbs (רשימת ה־webapp/templates/…).
    • הסרתי את שם הקובץ הכפול (base_repo.html) והשארתי רק את הנתיב המלא.
    • כפתור היסטוריה עכשיו באותה שורה עם הנתיב.
    • החזרתי את עיצוב כפתור העתק לסגנון הישן (כפתור אייקון).
    • החיפוש בדפדפן ריפו מתבצע רק בלחיצה על Enter.
    • תוצאות החיפוש כבר לא מסתירות את שורת החיפוש (הדרופדאון ממוקם מתחתיה ונשאר מאחור).

    בדיקות

    • לא הרצתי בדיקות (לא התבקשתי).

    רוצה שאוסיף גם עמוד/ים לאתר התיעוד על השינויים בדפדפן הריפו והחיפוש?

    View PR
    Open in Cursor Open in Web

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions