From 8ab5f20f532bc6e9de38ee457b0ef8dd30c80374 Mon Sep 17 00:00:00 2001 From: Marius Peter Date: Sun, 19 Jan 2025 20:00:18 +0100 Subject: Initial commit for ogit. --- bin/dune | 6 ++++++ bin/main.ml | 10 ++++++++++ dune-project | 30 ++++++++++++++++++++++++++++++ lib/handlers/dune | 8 ++++++++ lib/handlers/handlers.ml | 43 +++++++++++++++++++++++++++++++++++++++++++ lib/helpers/dune | 9 +++++++++ lib/helpers/file_helpers.ml | 7 +++++++ lib/helpers/html_helpers.ml | 18 ++++++++++++++++++ lib/layouts/dune | 16 ++++++++++++++++ lib/layouts/header.eml.html | 3 +++ lib/layouts/topnav.eml.html | 11 +++++++++++ ogit.opam | 33 +++++++++++++++++++++++++++++++++ test/dune | 2 ++ test/test_ogit.ml | 0 14 files changed, 196 insertions(+) create mode 100644 bin/dune create mode 100644 bin/main.ml create mode 100644 dune-project create mode 100644 lib/handlers/dune create mode 100644 lib/handlers/handlers.ml create mode 100644 lib/helpers/dune create mode 100644 lib/helpers/file_helpers.ml create mode 100644 lib/helpers/html_helpers.ml create mode 100644 lib/layouts/dune create mode 100644 lib/layouts/header.eml.html create mode 100644 lib/layouts/topnav.eml.html create mode 100644 ogit.opam create mode 100644 test/dune create mode 100644 test/test_ogit.ml diff --git a/bin/dune b/bin/dune new file mode 100644 index 0000000..e1b7b0d --- /dev/null +++ b/bin/dune @@ -0,0 +1,6 @@ +(executable + (public_name ogit) + (name main) + (libraries + dream + ogit.handlers)) diff --git a/bin/main.ml b/bin/main.ml new file mode 100644 index 0000000..8c49c91 --- /dev/null +++ b/bin/main.ml @@ -0,0 +1,10 @@ +(* ogit: A lightweight, mobile-friendly alternative to cgit *) + +let () = + Dream.run + @@ Dream.logger + @@ Dream.router [ + Dream.get "/" Handlers.root; + Dream.get "/:repo_name/" Handlers.repo_root; + Dream.get "/:repo_name/tree" Handlers.repo_tree; + ] diff --git a/dune-project b/dune-project new file mode 100644 index 0000000..c17bde7 --- /dev/null +++ b/dune-project @@ -0,0 +1,30 @@ +(lang dune 3.16) + +(name ogit) + +(generate_opam_files true) + +(source + (github username/reponame)) + +(authors "Marius Peter") + +(maintainers "Marius Peter") + +(license LICENSE) + +(documentation https://url/to/documentation) + +(package + (name ogit) + (synopsis "Replacement for cgit") + (description "A longer description") + (depends + ocaml + dune + dream + git) + (tags + (topics "to describe" your project))) + +; See the complete stanza docs at https://dune.readthedocs.io/en/stable/reference/dune-project/index.html diff --git a/lib/handlers/dune b/lib/handlers/dune new file mode 100644 index 0000000..ae64b71 --- /dev/null +++ b/lib/handlers/dune @@ -0,0 +1,8 @@ +(library + (name handlers) + (public_name ogit.handlers) + (libraries + dream + ogit.helpers + ogit.layouts) + (modules handlers)) diff --git a/lib/handlers/handlers.ml b/lib/handlers/handlers.ml new file mode 100644 index 0000000..7142439 --- /dev/null +++ b/lib/handlers/handlers.ml @@ -0,0 +1,43 @@ +(* Page layout function *) +let page_layout ~content = + "" + ^ Layouts.Header.header () + ^ Layouts.Topnav.topnav () + ^ "
" ^ content ^ "
" + ^ "" + +let root _ = + let content = + "

Available Repositories

" + in + Dream.html (page_layout ~content) + +let repo_root _ = + (* let repo_name = Dream.param request "repo_name" in *) + let content = + "
\n" + ^ "\n" + ^ "\n" + ^ "\n" + ^ "\n" + ^ "\n" + ^ "\n" + ^ "\n" + ^ "\n" + ^ "
BranchCommit messageAuthorAge
masterEnsure session[:id] before scoring: all tests now pass.Marius Peter2 weeks
 
TagDownloadAuthorAge
v1.0commit 175111f9d8...Marius Peter2 weeks
 
AgeCommit messageAuthor
2025-01-02Ensure session[:id] before scoring: all tests now pass.HEADmasterMarius Peter
" + in + Dream.html (page_layout ~content) + +let repo_tree request = + let repo_name = Dream.param request "repo_name" in + let repo_path = Filename.concat (Unix.getenv "HOME") ("git/" ^ repo_name) in + let content = + if Sys.file_exists repo_path && Sys.is_directory repo_path then + let files = Helpers.File_helpers.list_files repo_path in + "

Browsing repository: " ^ repo_name ^ "

" + else + "

Repository not found: " ^ repo_name ^ "

" + in + Dream.html (page_layout ~content) diff --git a/lib/helpers/dune b/lib/helpers/dune new file mode 100644 index 0000000..a8c1733 --- /dev/null +++ b/lib/helpers/dune @@ -0,0 +1,9 @@ +(library + (name helpers) + (public_name ogit.helpers) + (libraries + unix + ogit.layouts) + (modules + html_helpers + file_helpers)) diff --git a/lib/helpers/file_helpers.ml b/lib/helpers/file_helpers.ml new file mode 100644 index 0000000..892d807 --- /dev/null +++ b/lib/helpers/file_helpers.ml @@ -0,0 +1,7 @@ +let list_files dir = + try + Array.to_list (Sys.readdir dir) + |> List.map (fun file -> Printf.sprintf "
  • %s
  • " file) + |> String.concat "" + with _ -> + "
  • Error: Unable to read directory
  • " diff --git a/lib/helpers/html_helpers.ml b/lib/helpers/html_helpers.ml new file mode 100644 index 0000000..da5addc --- /dev/null +++ b/lib/helpers/html_helpers.ml @@ -0,0 +1,18 @@ +(* Helper function to generate links for repositories *) +let generate_repo_links () = + let git_dir = Filename.concat (Unix.getenv "HOME") "git" in + if Sys.file_exists git_dir && Sys.is_directory git_dir then + Sys.readdir git_dir + |> Array.to_list + |> List.map (fun repo -> Printf.sprintf "
  • %s
  • " repo repo) + |> String.concat "" + else + "
  • Error: '~/git' directory not found.
  • " + +(* Page layout function *) +let page_layout ~content = + "" + ^ Layouts.Header.header () + ^ Layouts.Topnav.topnav () + ^ "
    " ^ content ^ "
    " + ^ "" diff --git a/lib/layouts/dune b/lib/layouts/dune new file mode 100644 index 0000000..ee236ea --- /dev/null +++ b/lib/layouts/dune @@ -0,0 +1,16 @@ +(library + (name layouts) + (public_name ogit.layouts) + (modules header topnav)) + +; Rule to preprocess header.eml.html +(rule + (targets header.ml) + (deps header.eml.html) + (action (run dream_eml %{deps} --workspace %{workspace_root}))) + +; Rule to preprocess topnav.eml.html +(rule + (targets topnav.ml) + (deps topnav.eml.html) + (action (run dream_eml %{deps} --workspace %{workspace_root}))) diff --git a/lib/layouts/header.eml.html b/lib/layouts/header.eml.html new file mode 100644 index 0000000..d7bf4ef --- /dev/null +++ b/lib/layouts/header.eml.html @@ -0,0 +1,3 @@ +let header _ = +

    ogit

    +

    Your mobile-friendly Git repository viewer.

    diff --git a/lib/layouts/topnav.eml.html b/lib/layouts/topnav.eml.html new file mode 100644 index 0000000..a9f0864 --- /dev/null +++ b/lib/layouts/topnav.eml.html @@ -0,0 +1,11 @@ +let topnav _ = + diff --git a/ogit.opam b/ogit.opam new file mode 100644 index 0000000..9588bbf --- /dev/null +++ b/ogit.opam @@ -0,0 +1,33 @@ +# This file is generated by dune, edit dune-project instead +opam-version: "2.0" +synopsis: "Replacement for cgit" +description: "A longer description" +maintainer: ["Marius Peter"] +authors: ["Marius Peter"] +license: "LICENSE" +tags: ["topics" "to describe" "your" "project"] +homepage: "https://github.com/username/reponame" +doc: "https://url/to/documentation" +bug-reports: "https://github.com/username/reponame/issues" +depends: [ + "ocaml" + "dune" {>= "3.16"} + "dream" + "git" + "odoc" {with-doc} +] +build: [ + ["dune" "subst"] {dev} + [ + "dune" + "build" + "-p" + name + "-j" + jobs + "@install" + "@runtest" {with-test} + "@doc" {with-doc} + ] +] +dev-repo: "git+https://github.com/username/reponame.git" diff --git a/test/dune b/test/dune new file mode 100644 index 0000000..7b9beb4 --- /dev/null +++ b/test/dune @@ -0,0 +1,2 @@ +(test + (name test_ogit)) diff --git a/test/test_ogit.ml b/test/test_ogit.ml new file mode 100644 index 0000000..e69de29 -- cgit v1.2.3