move forking code to separate class
[phorkie.git] / src / phorkie / Forker.php
diff --git a/src/phorkie/Forker.php b/src/phorkie/Forker.php
new file mode 100644 (file)
index 0000000..3425a72
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+namespace phorkie;
+
+class Forker
+{
+    public function forkLocal($repo)
+    {
+        $new = $this->fork($repo->gitDir);
+        \copy($repo->gitDir . '/description', $new->gitDir . '/description');
+        return $new;
+    }
+
+    public function forkRemote($url)
+    {
+        $new = $this->fork($url);
+        file_put_contents(
+            $new->gitDir . '/description',
+            'Fork of ' . $url
+        );
+        return $new;
+    }
+
+
+    protected function fork($pathOrUrl)
+    {
+        $rs = new Repositories();
+        $new = $rs->createNew();
+        $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($pathOrUrl)
+            ->addArgument($new->workDir)
+            ->execute();
+        foreach (\glob($new->gitDir . '/hooks/*') as $hookfile) {
+            \unlink($hookfile);
+        }
+        return $new;
+    }
+}
+
+?>