GitHub Sale: sign up for any paid plan this week and pay nothing until January 1, 2009!  [ hide ]

public
Description: Midgard Components Framework 3rd generation
Homepage: http://www.midgard-project.org
Clone URL: git://github.com/bergie/midcom.git
midcom / build / symlinkStatics.php
100644 137 lines (116 sloc) 3.13 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php
/**
* @copyright The Midgard Project, http://www.midgard-project.org
* @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License
*/
 
require_once "phing/Task.php";
require_once 'phing/types/FileSet.php';
 
/**
* task to link all static folders
*/
class symlinkStatics extends Task
{
  private $static_dir;
  private $filesets = array();
    
    function __construct() {}
 
    /**
* The setter for the attribute "static_dir"
*/
    public function setStatic_dir($str)
    {
        $this->static_dir = $str;
    }
 
  /**
   * Add a new fileset containing the .php files to process
   *
   * @param FileSet the new fileset containing static files
   */
  public function addFileSet(FileSet $fileset)
  {
    $this->filesets[] = $fileset;
  }
    
    /**
* The init method: Do init steps.
*/
    public function init()
    {
        // nothing to do here
    }
    
    /**
* The main entry point method.
*/
    public function main()
    {
        $folders = $this->get_folders();
        
        foreach ($folders as $component => $folder)
        {
            $folder = realpath($folder);
            $link = "{$this->static_dir}/{$component}";
            
            if (is_dir($folder))
            {
                $this->make_symlink($folder, $link);
            }
        }
    }
    
  /**
   * Iterate over all filesets and return the details of all separate component and their static folder.
   *
   * @return array an array of (component, static folder) pairs
   */
  private function get_folders()
  {
    $folders = array();
 
    foreach ($this->filesets as $fileset)
    {
      $ds = $fileset->getDirectoryScanner($this->project);
      $ds->scan();
 
            $includedFolders = $ds->getIncludedDirectories();
            
      foreach ($includedFolders as $folder)
      {
        $folderparts = explode('/', $folder);
        
        if (! array_key_exists($folderparts[0], $folders))
        {
            $folders[$folderparts[0]] = $folder;
        }
      }
    }
 
    return $folders;
  }
  
    /**
* Creates a symlink to the file or directory
* @param string from the folder to link
* @param string link name of the link to be created
* @param string debug enable output
*/
    private function make_symlink($from , $link, $debug = false)
    {
        if (is_link($link))
        {
            return;
        }
        
        $command = sprintf("ln -s %s %s", $from, $link);
        $this->exec_command($command, $debug);
    }
 
    /**
* Executes a given command.
* @return none
* @throws exception
* @param string $command the command to be executed
* @param boolean $debug set to true if you want to just see the
* command to be executed.
*/
    private function exec_command($command, $debug = false) {
        if ($debug)
        {
            echo $command . "\n";
            return;
        }
        
        $ret = "";
        exec($command, & $output, $ret);
        if ($ret !== 0)
        {
            throw new Exception("Exec of $command returned non zero code $ret");
        }
 
    }
}
    
?>