~jan0sch/smederee

Showing details for patch e44bdf45a13ced75b08f067ff5dc3b0e37c8ce80.
2022-08-06 (Sat), 2:37 PM - Jens Grassel - e44bdf45a13ced75b08f067ff5dc3b0e37c8ce80

VCS: Create repo after form submit

- only minimal error handling
- directory for users gets created if it not exists
Summary of changes
1 files modified with 33 lines added and 3 lines removed
  • modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryRoutes.scala with 33 added and 3 removed lines
diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryRoutes.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryRoutes.scala
--- old-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryRoutes.scala	2025-02-02 23:07:16.872302036 +0000
+++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryRoutes.scala	2025-02-02 23:07:16.876302043 +0000
@@ -9,6 +9,8 @@
 
 package de.smederee.hub
 
+import java.nio.file._
+
 import cats.data._
 import cats.effect._
 import cats.syntax.all._
@@ -18,8 +20,10 @@
 import de.smederee.hub.forms.types.FormErrors
 import org.http4s._
 import org.http4s.dsl.Http4sDsl
+import org.http4s.headers.Location
 import org.http4s.implicits._
 import org.http4s.twirl.TwirlInstances._
+import org.slf4j.LoggerFactory
 
 /** Routes for handling VCS repositories, including creation, management and public serving.
   *
@@ -32,6 +36,7 @@
   */
 final class VcsRepositoryRoutes[F[_]: Async](config: DarcsConfiguration, darcs: DarcsCommands[F])
     extends Http4sDsl[F] {
+  private val log = LoggerFactory.getLogger(getClass)
 
   private val createRepoPath = uri"/repo/create"
 
@@ -59,8 +64,34 @@
                     FormErrors.fromNel(es)
                   )
               )
-            case Validated.Valid(newVcsForm) =>
-              NotImplemented.apply("Not yet implemented!")
+            case Validated.Valid(newVcsRepository) =>
+              for {
+                directory <- Sync[F].delay(
+                  Paths.get(config.repositoriesDirectory.toPath.toString, user.name.toString)
+                )
+                _ <- Sync[F].delay {
+                  if (!Files.exists(directory)) {
+                    log.debug(s"User repository directory does not exist, trying to create it: $directory")
+                    Files.createDirectories(directory)
+                  }
+                }
+                output <- darcs.initialize(directory)(newVcsRepository.name.toString)(Chain.empty)
+                resp <- output.exitValue match {
+                  case 0 =>
+                    SeeOther.apply(Location(Uri(path = Uri.Path.Root)))
+                  case _ =>
+                    for {
+                      _ <- Sync[F].delay(
+                        log.error(
+                          s"Error creating the repository ${newVcsRepository.name} in directory $directory: ${output.stderr.toList.mkString}"
+                        )
+                      )
+                      resp <- InternalServerError.apply(
+                        s"Error creating the repository: ${output.stderr.toList.mkString}"
+                      )
+                    } yield resp
+                }
+              } yield resp
           }
         } yield resp
       }
@@ -70,7 +101,6 @@
     case ar @ GET -> Root / "repo" / "create" as user =>
       for {
         csrf <- Sync[F].delay(ar.req.getCsrfToken)
-        // output <- darcs.initialize(config.repositoriesDirectory.toPath)("TEST-REPO")(Chain.empty)
         resp <- Ok(
           views.html
             .createRepository()(createRepoPath, csrf, "Smederee - Create a new repository".some, user)()