FIX: Revamped security measures
[phorkie.git] / www / fork.php
index 6bec5f03bd0cba3f5cf76ee0416a666519fa2761..2832fe4e60fa32c1d5c1f2f85f06e3c91cb4e858 100644 (file)
@@ -2,22 +2,33 @@
 /**
  * Fork a repository
  */
 /**
  * Fork a repository
  */
-namespace Phorkie;
+namespace phorkie;
+$pageRequiresLogin = '1';
 require_once 'www-header.php';
 require_once 'www-header.php';
+
+if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
+    throw new Exception_Input('Forking only possible via POST');
+}
+
 $repo = new Repository();
 $repo->loadFromRequest();
 
 $rs = new Repositories();
 $new = $rs->createNew();
 $repo = new Repository();
 $repo->loadFromRequest();
 
 $rs = new Repositories();
 $new = $rs->createNew();
-$new->getVc()->getCommand('clone')
-    ->addArgument($repo->repoDir)
-    ->addArgument($new->repoDir)
+$vc = $new->getVc();
+\rmdir($new->gitDir);//VersionControl_Git wants an existing dir, git clone not
+$vc->getCommand('clone')
+    //this should be setOption, but it fails with a = between name and value
+    ->addArgument('--separate-git-dir')
+    ->addArgument($GLOBALS['phorkie']['cfg']['gitdir'] . '/' . $new->id . '.git')
+    ->addArgument($repo->gitDir)
+    ->addArgument($new->workDir)
     ->execute();
     ->execute();
-\copy($repo->repoDir . '/.git/description', $new->repoDir . '/.git/description');
-foreach (glob($new->repoDir . '/.git/hooks/*') as $hookfile) {
-    unlink($hookfile);
+\copy($repo->gitDir . '/description', $new->gitDir . '/description');
+foreach (\glob($new->gitDir . '/hooks/*') as $hookfile) {
+    \unlink($hookfile);
 }
 
 //FIXME: where to put fork source link?
 redirect($new->getLink('display'));
 }
 
 //FIXME: where to put fork source link?
 redirect($new->getLink('display'));
-?>
\ No newline at end of file
+?>