gitlatex 2.0.0__tar.gz → 2.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {gitlatex-2.0.0/gitlatex.egg-info → gitlatex-2.0.1}/PKG-INFO +1 -1
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/_version.py +3 -3
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/http.py +13 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/routes/compile.py +4 -1
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/routes/git.py +68 -5
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/routes/workspace.py +5 -1
- gitlatex-2.0.1/gitlatex/state.py +34 -0
- gitlatex-2.0.0/gitlatex/ui/assets/PdfViewer-Bd94D2QV.js → gitlatex-2.0.1/gitlatex/ui/assets/PdfViewer-CSeWHO6L.js +2 -2
- gitlatex-2.0.0/gitlatex/ui/assets/index-Y8smC0mJ.js → gitlatex-2.0.1/gitlatex/ui/assets/index-CRd_ihCz.js +4 -4
- gitlatex-2.0.0/gitlatex/ui/assets/monaco-vim.umd-DNcbBSgx.js → gitlatex-2.0.1/gitlatex/ui/assets/monaco-vim.umd-TnvlvL5k.js +2 -2
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/index.html +1 -1
- {gitlatex-2.0.0 → gitlatex-2.0.1/gitlatex.egg-info}/PKG-INFO +1 -1
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex.egg-info/SOURCES.txt +3 -3
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex.egg-info/scm_version.json +2 -2
- gitlatex-2.0.0/gitlatex/state.py +0 -27
- {gitlatex-2.0.0 → gitlatex-2.0.1}/.github/workflows/publish.yml +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/.gitignore +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/MANIFEST.in +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/README.md +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/docs/vim-mode.md +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/__init__.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/__main__.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/app.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/engine/manifest.json +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/app.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/bib-commands.json +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/css/base.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/css/console.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/css/docs.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/css/editor.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/css/home.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/css/layout.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/css/loading.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/css/outline.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/css/problems.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/css/review.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/css/settings.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/css/sidebar.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/css/support.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/css/toolbar.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/css/updates.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/css/versions.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/favicon.svg +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/index.html +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/build/compile.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/build/problems.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/core/api.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/core/filetypes.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/core/router.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/core/state.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/core/storage.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/editor/completions.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/editor/envcolors.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/editor/filetree.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/editor/languages.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/editor/mainfile.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/editor/monaco.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/editor/outline.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/editor/projectindex.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/editor/review.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/editor/session.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/editor/snippets.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/editor/spell.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/editor/synctex.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/editor/vim.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/editor/vimtex.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/git/actions.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/git/diffview.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/git/menu.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/git/versions.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/home/repolist.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/ui/consolepane.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/ui/layout.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/ui/loading.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/ui/modals.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/ui/pdfviewer.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/ui/settings.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/ui/theme.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/js/ui/viewer.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/public/latex-commands.json +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/routes/__init__.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/routes/engine.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/routes/files.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/routes/pages.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/routes/projectindex.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/routes/repos.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/routes/review.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/routes/snippets.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/routes/spell.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/routes/synctex.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/routes/system.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/server.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/services/__init__.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/services/comments.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/services/git_backend.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/services/gitrepo.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/services/latex.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/services/paths.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/services/projectindex.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/services/snippets.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/services/spell.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/services/synctex.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/services/synctex_reader.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/services/updates.py +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/codicon-DF1abBS2.ttf +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/editor.worker-Yd1NR0QT.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/index-DzQbJ7aZ.css +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/material-symbols-outlined-DzyP15l8.woff2 +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/pdf.worker.min-BmVo14Nb.mjs +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/assets/tex.worker-5oo4mY5v.js +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex/ui/favicon.svg +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex.egg-info/dependency_links.txt +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex.egg-info/entry_points.txt +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex.egg-info/requires.txt +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex.egg-info/scm_file_list.json +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/gitlatex.egg-info/top_level.txt +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/pyproject.toml +0 -0
- {gitlatex-2.0.0 → gitlatex-2.0.1}/setup.cfg +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '2.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (2, 0,
|
|
21
|
+
__version__ = version = '2.0.1'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 0, 1)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'ga0d651549'
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"""Small helpers and constants shared by every route module."""
|
|
2
2
|
|
|
3
|
+
import functools
|
|
4
|
+
|
|
3
5
|
from flask import request
|
|
4
6
|
|
|
7
|
+
from gitlatex import state
|
|
8
|
+
|
|
5
9
|
MIME_TYPES = {
|
|
6
10
|
".pdf": "application/pdf",
|
|
7
11
|
".png": "image/png",
|
|
@@ -29,6 +33,15 @@ ASSET_EXTENSIONS = frozenset({".css", ".js", ".mjs", ".svg", ".ico", ".png", ".j
|
|
|
29
33
|
".woff2", ".ttf", ".wasm"})
|
|
30
34
|
|
|
31
35
|
|
|
36
|
+
def with_project_lock(view):
|
|
37
|
+
"""Run a route while holding state.project_lock (see gitlatex/state.py)."""
|
|
38
|
+
@functools.wraps(view)
|
|
39
|
+
def wrapper(*args, **kwargs):
|
|
40
|
+
with state.project_lock:
|
|
41
|
+
return view(*args, **kwargs)
|
|
42
|
+
return wrapper
|
|
43
|
+
|
|
44
|
+
|
|
32
45
|
def _json():
|
|
33
46
|
"""Request JSON body; default to empty dict."""
|
|
34
47
|
return request.get_json(force=True, silent=True) or {}
|
|
@@ -7,7 +7,7 @@ import subprocess
|
|
|
7
7
|
from flask import Blueprint, jsonify, request, send_file
|
|
8
8
|
|
|
9
9
|
from gitlatex import state
|
|
10
|
-
from gitlatex.http import _json
|
|
10
|
+
from gitlatex.http import _json, with_project_lock
|
|
11
11
|
from gitlatex.services.latex import LATEX_ENGINES, run_latex_build
|
|
12
12
|
from gitlatex.services.paths import resolve_repo_path
|
|
13
13
|
from gitlatex.services.synctex import save_remote_synctex
|
|
@@ -16,6 +16,7 @@ bp = Blueprint("compile", __name__)
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
@bp.route("/compile", methods=["GET", "POST"])
|
|
19
|
+
@with_project_lock
|
|
19
20
|
def compile_latex():
|
|
20
21
|
if request.method == "GET":
|
|
21
22
|
return jsonify(
|
|
@@ -111,11 +112,13 @@ def handle_save_pdf():
|
|
|
111
112
|
|
|
112
113
|
|
|
113
114
|
@bp.route("/save-pdf", methods=["POST"])
|
|
115
|
+
@with_project_lock
|
|
114
116
|
def save_pdf():
|
|
115
117
|
return handle_save_pdf()
|
|
116
118
|
|
|
117
119
|
|
|
118
120
|
@bp.route("/api/save-pdf", methods=["POST"])
|
|
121
|
+
@with_project_lock
|
|
119
122
|
def api_save_pdf():
|
|
120
123
|
return handle_save_pdf()
|
|
121
124
|
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"""Git operations: push, pull, status, history and diffs."""
|
|
2
2
|
|
|
3
3
|
import datetime
|
|
4
|
+
import re
|
|
4
5
|
import os
|
|
5
6
|
|
|
6
7
|
from flask import Blueprint, jsonify, request
|
|
7
8
|
|
|
8
9
|
from gitlatex import state
|
|
10
|
+
from gitlatex.http import with_project_lock
|
|
9
11
|
from gitlatex.services.git_backend import NULL_TREE, GitCommandError, Repo
|
|
10
12
|
from gitlatex.services.gitrepo import _blob_text, _close_repo, _numstat, _open_repo
|
|
11
13
|
from gitlatex.services.paths import resolve_repo_path
|
|
@@ -14,6 +16,7 @@ bp = Blueprint("git", __name__)
|
|
|
14
16
|
|
|
15
17
|
|
|
16
18
|
@bp.route("/push", methods=["POST"])
|
|
19
|
+
@with_project_lock
|
|
17
20
|
def push():
|
|
18
21
|
if not state.current_repo_path:
|
|
19
22
|
return jsonify(error="No repository selected"), 400
|
|
@@ -52,6 +55,7 @@ def push():
|
|
|
52
55
|
|
|
53
56
|
|
|
54
57
|
@bp.route("/api/git/commit", methods=["POST"])
|
|
58
|
+
@with_project_lock
|
|
55
59
|
def commit_all():
|
|
56
60
|
"""Stage everything and commit, without pushing (for projects with no remote)."""
|
|
57
61
|
if not state.current_repo_path:
|
|
@@ -79,6 +83,7 @@ def commit_all():
|
|
|
79
83
|
|
|
80
84
|
|
|
81
85
|
@bp.route("/api/git/init", methods=["POST"])
|
|
86
|
+
@with_project_lock
|
|
82
87
|
def init_repo():
|
|
83
88
|
if not state.current_repo_path:
|
|
84
89
|
return jsonify(error="No repository selected"), 400
|
|
@@ -97,7 +102,62 @@ def _json_message():
|
|
|
97
102
|
return message.strip() if isinstance(message, str) else ""
|
|
98
103
|
|
|
99
104
|
|
|
105
|
+
# What TeX writes next to a document. Committed copies are common (people
|
|
106
|
+
# commit main.pdf), and every compile rewrites them locally.
|
|
107
|
+
_BUILD_OUTPUT = re.compile(
|
|
108
|
+
r"\.(synctex\.gz|synctex|aux|log|out|toc|lof|lot|fls|fdb_latexmk|bcf|run\.xml|blg|bbl|nav|snm|vrb|xdv)$",
|
|
109
|
+
re.IGNORECASE,
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _is_build_output(root, path):
|
|
114
|
+
if _BUILD_OUTPUT.search(path):
|
|
115
|
+
return True
|
|
116
|
+
# A PDF is build output only when it is a document's own PDF (main.pdf next
|
|
117
|
+
# to main.tex); figure PDFs are the user's files.
|
|
118
|
+
if path.lower().endswith(".pdf"):
|
|
119
|
+
return os.path.isfile(os.path.join(root, path[:-4] + ".tex"))
|
|
120
|
+
return False
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _clear_stale_build_outputs(repo):
|
|
124
|
+
"""Drop local build outputs that the incoming commits replace.
|
|
125
|
+
|
|
126
|
+
Compiling rewrites main.pdf (PDFs embed a timestamp) and writes
|
|
127
|
+
main.synctex.gz, so a project that commits them always looks modified, and
|
|
128
|
+
`git pull` refuses to overwrite them. They are regenerated by the next
|
|
129
|
+
compile anyway, so the remote's copies win. Only files the remote actually
|
|
130
|
+
changes are touched; the user's own edits are left to --autostash.
|
|
131
|
+
Returns the paths cleared.
|
|
132
|
+
"""
|
|
133
|
+
try:
|
|
134
|
+
if not repo.remotes or repo.head.is_detached or repo.active_branch.tracking_branch() is None:
|
|
135
|
+
return []
|
|
136
|
+
repo.git.fetch("--quiet")
|
|
137
|
+
incoming = repo.git.diff("--name-only", "HEAD...@{u}").splitlines()
|
|
138
|
+
except (GitCommandError, TypeError, ValueError):
|
|
139
|
+
return []
|
|
140
|
+
root = repo.working_tree_dir
|
|
141
|
+
modified = set(repo.git.diff("--name-only").splitlines()) | set(repo.git.diff("--name-only", "--cached").splitlines())
|
|
142
|
+
untracked = set(repo.untracked_files)
|
|
143
|
+
cleared = []
|
|
144
|
+
for path in incoming:
|
|
145
|
+
if not _is_build_output(root, path):
|
|
146
|
+
continue
|
|
147
|
+
try:
|
|
148
|
+
if path in modified:
|
|
149
|
+
repo.git.checkout("HEAD", "--", path)
|
|
150
|
+
cleared.append(path)
|
|
151
|
+
elif path in untracked:
|
|
152
|
+
os.remove(os.path.join(root, path))
|
|
153
|
+
cleared.append(path)
|
|
154
|
+
except (GitCommandError, OSError) as e:
|
|
155
|
+
print("Could not clear", path, e)
|
|
156
|
+
return cleared
|
|
157
|
+
|
|
158
|
+
|
|
100
159
|
@bp.route("/pull", methods=["POST"])
|
|
160
|
+
@with_project_lock
|
|
101
161
|
def pull():
|
|
102
162
|
if not state.current_repo_path:
|
|
103
163
|
return jsonify(error="No repository selected"), 400
|
|
@@ -107,15 +167,18 @@ def pull():
|
|
|
107
167
|
repo = Repo(state.current_repo_path)
|
|
108
168
|
try:
|
|
109
169
|
before = repo.head.commit.hexsha if repo.head.is_valid() else None
|
|
110
|
-
|
|
111
|
-
#
|
|
170
|
+
cleared = _clear_stale_build_outputs(repo)
|
|
171
|
+
# --autostash sets the user's own uncommitted edits aside and puts
|
|
172
|
+
# them back after the merge; older gits don't support it for merges.
|
|
112
173
|
try:
|
|
113
174
|
output = repo.git.pull("--autostash")
|
|
114
|
-
except GitCommandError:
|
|
175
|
+
except GitCommandError as e:
|
|
176
|
+
if "--autostash" not in str(e) and "autostash" not in str(e).lower():
|
|
177
|
+
raise
|
|
115
178
|
output = repo.git.pull()
|
|
116
179
|
after = repo.head.commit.hexsha if repo.head.is_valid() else None
|
|
117
|
-
print("Pulled from origin")
|
|
118
|
-
return jsonify(success=True, output=output, changed=before != after)
|
|
180
|
+
print("Pulled from origin" + (" (replaced local build output: %s)" % ", ".join(cleared) if cleared else ""))
|
|
181
|
+
return jsonify(success=True, output=output, changed=before != after, cleared=cleared)
|
|
119
182
|
finally:
|
|
120
183
|
if getattr(repo, "close", None):
|
|
121
184
|
try:
|
|
@@ -22,7 +22,7 @@ import shutil
|
|
|
22
22
|
from flask import Blueprint, jsonify
|
|
23
23
|
|
|
24
24
|
from gitlatex import state
|
|
25
|
-
from gitlatex.http import _json
|
|
25
|
+
from gitlatex.http import _json, with_project_lock
|
|
26
26
|
from gitlatex.services import comments
|
|
27
27
|
from gitlatex.services.git_backend import Repo
|
|
28
28
|
from gitlatex.services.paths import resolve_repo_path
|
|
@@ -167,6 +167,7 @@ def rename_project():
|
|
|
167
167
|
|
|
168
168
|
|
|
169
169
|
@bp.route("/api/fs/write", methods=["POST"])
|
|
170
|
+
@with_project_lock
|
|
170
171
|
def write_file():
|
|
171
172
|
if not state.current_repo_path:
|
|
172
173
|
return _no_project()
|
|
@@ -185,6 +186,7 @@ def write_file():
|
|
|
185
186
|
|
|
186
187
|
|
|
187
188
|
@bp.route("/api/fs/mkdir", methods=["POST"])
|
|
189
|
+
@with_project_lock
|
|
188
190
|
def make_dir():
|
|
189
191
|
if not state.current_repo_path:
|
|
190
192
|
return _no_project()
|
|
@@ -201,6 +203,7 @@ def make_dir():
|
|
|
201
203
|
|
|
202
204
|
|
|
203
205
|
@bp.route("/api/fs/delete", methods=["POST"])
|
|
206
|
+
@with_project_lock
|
|
204
207
|
def delete_path():
|
|
205
208
|
if not state.current_repo_path:
|
|
206
209
|
return _no_project()
|
|
@@ -220,6 +223,7 @@ def delete_path():
|
|
|
220
223
|
|
|
221
224
|
|
|
222
225
|
@bp.route("/api/fs/move", methods=["POST"])
|
|
226
|
+
@with_project_lock
|
|
223
227
|
def move_path():
|
|
224
228
|
if not state.current_repo_path:
|
|
225
229
|
return _no_project()
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""Process-wide server state.
|
|
2
|
+
|
|
3
|
+
These values are genuinely global to a running server: which repos folder
|
|
4
|
+
is being served, which project the user has selected, the last compile error,
|
|
5
|
+
and the lock that serializes changes to project files. Route modules import
|
|
6
|
+
this module and read `state.x` rather than importing the names directly, so
|
|
7
|
+
everyone sees the same value after a rebind.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import threading
|
|
11
|
+
|
|
12
|
+
# Absolute path of the repos folder, set once at startup by create_app().
|
|
13
|
+
BASE_DIR = None
|
|
14
|
+
|
|
15
|
+
# Absolute path of the project the user has selected, or None.
|
|
16
|
+
current_repo_path = None
|
|
17
|
+
|
|
18
|
+
# Message from the most recent failed compile, surfaced by /compile-error.
|
|
19
|
+
last_compile_error = None
|
|
20
|
+
|
|
21
|
+
# Held by everything that changes a project's files: Git (pull, push, commit),
|
|
22
|
+
# compiles, PDF saves and the editor's writes. A PDF saved in the middle of a
|
|
23
|
+
# pull would otherwise be caught by --autostash and conflict when it is put back.
|
|
24
|
+
project_lock = threading.RLock()
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def repo_selected():
|
|
28
|
+
return current_repo_path is not None
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def repo_name():
|
|
32
|
+
"""Folder name of the selected project, or None."""
|
|
33
|
+
import os
|
|
34
|
+
return os.path.basename(current_repo_path) if current_repo_path else None
|