added .htaccess to .gitmanaged directory
[GITManagedWebpage.git] / GITManagedWebpage.class.php
index 0cf408ce4bc1550134e1b9ca2908bc86ff820c8e..3f6ba4aae7772b0ee2d943f53ea4eaa9d57daf94 100644 (file)
@@ -90,7 +90,7 @@ class GITManagedWebpage {
             } else
                 $argstr .= " ".escapeshellarg($arg);
         }
-        $gitcmd = 'git '.escapeshellarg('--git-dir='.$this->workdir.'repository/.git').$argstr;
+        $gitcmd = 'git '.escapeshellarg('--git-dir='.$this->workdir.'repository/.git').' '.escapeshellarg('--work-tree='.$this->workdir.'repository').$argstr;
         $output = shell_exec($gitcmd);
         return $output;
     }
@@ -103,6 +103,16 @@ class GITManagedWebpage {
         $this->config_changed = true;
     }
     
+    private function checkConfigIntegrity() {
+        foreach($this->config as $key => $value) {
+            if(substr($key, 0, strlen('branch_')) == 'branch_') {
+                if(!file_exists($this->workdir.$key)) {
+                    unset($this->config['key']);
+                }
+            }
+        }
+    }
+    
     /* private function getConfig($name)
     * get an option from the configuration
     */
@@ -113,6 +123,7 @@ class GITManagedWebpage {
             if(file_exists($this->workdir."config.txt")) {
                 $config_txt = @file_get_contents($this->workdir."config.txt");
                 $this->config = unserialize($config_txt);
+                $this->checkConfigIntegrity();
             } else {
                 $this->config = array();
                 return null;
@@ -153,6 +164,14 @@ class GITManagedWebpage {
             $this->error(self::ERROR_CRITICAL, "error cloning git repository.");
             return;
         }
+        
+        $fp = fopen($this->workdir.'.htaccess');
+        fwrite($fp, '
+Order deny,allow
+Deny from all
+');
+        fclose($fp);
+        
         $this->ready = true;
         
         $default_branch = str_replace(array("\r", "\n"), array("", ""), $this->gitcmd("rev-parse", "--abbrev-ref", "HEAD"));
@@ -218,7 +237,7 @@ class GITManagedWebpage {
         if($branch == $default_branch)
             $dir = $this->localdir;
         else
-            $dir = $this->workdir.'branch_'.$branch.'/';
+            $dir = $this->workdir.'branch_'.str_replace(array('/'), array('_'), $branch).'/';
         if(file_exists($dir))
             return $dir;
         else if($create) {
@@ -228,21 +247,19 @@ class GITManagedWebpage {
             return false;
     }
     
-    private function updateBranch($branch, $path) {
+    private function updateBranch($branch, $path, $force = false) {
         if(substr($path, -1) != '/')
             $path .= '/';
         $current_branch = str_replace(array("\r", "\n"), array("", ""), $this->gitcmd("rev-parse", "--abbrev-ref", "HEAD"));
-        if($current_branch != $branch)
-            $this->gitcmd("checkout", $branch);
-        $this->gitcmd("pull");
+        $this->gitcmd("fetch");
+        $this->gitcmd("reset", "--hard", "origin/".$branch);
         $gitret = $this->gitcmd("rev-list", "--max-count=1", $branch);
         preg_match("#([a-z0-9]{40})#", $gitret, $match);
         $newest_version = $match[1];
         
         $deleted_files = array();
         if(($current_version = $this->getConfig('version_'.$branch))) {
-            echo $current_version . " == " . $newest_version;
-            if($current_version == $newest_version)
+            if($current_version == $newest_version && !$force)
                 return;
             else {
                 $override_all = true;
@@ -291,17 +308,20 @@ class GITManagedWebpage {
         if($this->loopedcall)
             return;
         
-        if(!$this->branchExists($branch))
-            return false;
+        if(!$this->branchExists($branch)) {
+            $this->gitcmd("fetch");
+            if(!$this->branchExists('origin/'.$branch))
+                return false;
+        }
         $this->setActiveBranch($branch, $remember);
         
         if(!$this->localBranchPath($branch)) {
             $dir = $this->localBranchPath($branch, true);
-            $this->updateBranch($branch, $dir);
+            $this->updateBranch($branch, $dir, true);
         }
     }
     
-    public function execute($file = null) {
+    public function getExecFile($file = null) {
         if($this->loopedcall)
             return;
         define("GITMANAGED_EXECUTED", true);
@@ -314,13 +334,14 @@ class GITManagedWebpage {
         $default_branch = $this->getConfig("defaultbranch");
         $active_branch = $this->getActiveBranch();
         if($active_branch != $default_branch) {
-            if(!($dir = $this->localBranchPath($branch))) {
+            if(!($dir = $this->localBranchPath($active_branch))) {
                 $dir = $this->localBranchPath($active_branch, true);
-                $this->updateBranch($active_branch, $dir);
+                $this->updateBranch($active_branch, $dir, true);
             }
-            include_once($dir.$file);
+            chdir($dir);
+            return $dir.$file;
         } else {
-            include_once($this->localdir.$file);
+            return $file;
         }
     }