~jan0sch/smederee
Showing details for patch e44bdf45a13ced75b08f067ff5dc3b0e37c8ce80.
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)()