update 0.5.0 changelog
[phorkie.git] / src / phorkie / Forker.php
index f293455a54010187c2c8b667f23d17c204aa5106..da545a72c1eb590b4bedd98d9b35208800e3d438 100644 (file)
@@ -6,19 +6,49 @@ class Forker
     public function forkLocal($repo)
     {
         $new = $this->fork($repo->gitDir);
+
         \copy($repo->gitDir . '/description', $new->gitDir . '/description');
+        $new->getVc()
+            ->getCommand('config')
+            ->addArgument('remote.origin.title')
+            ->addArgument(file_get_contents($repo->gitDir . '/description'))
+            ->execute();
+
         $this->index($new);
+
+        $not = new Notificator();
+        $not->create($new);
+
         return $new;
     }
 
-    public function forkRemote($cloneUrl, $originalUrl)
+    public function forkRemote($cloneUrl, $originalUrl, $title = null)
     {
         $new = $this->fork($cloneUrl);
-        file_put_contents(
-            $new->gitDir . '/description',
-            'Fork of ' . $originalUrl
-        );
+
+        $new->getVc()
+            ->getCommand('config')
+            ->addArgument('remote.origin.title')
+            ->addArgument($title)
+            ->execute();
+        if ($originalUrl != $cloneUrl) {
+            $new->getVc()
+                ->getCommand('config')
+                ->addArgument('remote.origin.homepage')
+                ->addArgument($originalUrl)
+                ->execute();
+        }
+
+        if ($title === null) {
+            $title = 'Fork of ' . $originalUrl;
+        }
+        file_put_contents($new->gitDir . '/description', $title);
+
         $this->index($new);
+
+        $not = new Notificator();
+        $not->create($new);
+
         return $new;
     }
 
@@ -32,19 +62,29 @@ class Forker
         //VersionControl_Git wants an existing dir, git clone not
         \rmdir($new->gitDir);
 
-        $vc->getCommand('clone')
+        $cmd = $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);
+            ->addArgument($new->workDir);
+        try {
+            $cmd->execute();
+        } catch (\Exception $e) {
+            //clean up, we've got no workdir otherwise
+            $new->delete();
+            throw $e;
         }
 
+        $rs = new Repository_Setup($new);
+        $rs->afterInit();
+
+        //update info for dumb git HTTP transport
+        //the post-update hook should do that IMO, but does not somehow
+        $vc->getCommand('update-server-info')->execute();
+
         return $new;
     }