diff options
Diffstat (limited to 'project.py')
-rw-r--r-- | project.py | 57 |
1 files changed, 24 insertions, 33 deletions
@@ -69,6 +69,27 @@ def not_rev(r): | |||
69 | def sq(r): | 69 | def sq(r): |
70 | return "'" + r.replace("'", "'\''") + "'" | 70 | return "'" + r.replace("'", "'\''") + "'" |
71 | 71 | ||
72 | _project_hook_list = None | ||
73 | def _ProjectHooks(): | ||
74 | """List the hooks present in the 'hooks' directory. | ||
75 | |||
76 | These hooks are project hooks and are copied to the '.git/hooks' directory | ||
77 | of all subprojects. | ||
78 | |||
79 | This function caches the list of hooks (based on the contents of the | ||
80 | 'repo/hooks' directory) on the first call. | ||
81 | |||
82 | Returns: | ||
83 | A list of absolute paths to all of the files in the hooks directory. | ||
84 | """ | ||
85 | global _project_hook_list | ||
86 | if _project_hook_list is None: | ||
87 | d = os.path.realpath(os.path.abspath(os.path.dirname(__file__))) | ||
88 | d = os.path.join(d, 'hooks') | ||
89 | _project_hook_list = [os.path.join(d, x) for x in os.listdir(d)] | ||
90 | return _project_hook_list | ||
91 | |||
92 | |||
72 | class DownloadedChange(object): | 93 | class DownloadedChange(object): |
73 | _commit_cache = None | 94 | _commit_cache = None |
74 | 95 | ||
@@ -2085,7 +2106,7 @@ class Project(object): | |||
2085 | if GitCommand(self, cmd).Wait() != 0: | 2106 | if GitCommand(self, cmd).Wait() != 0: |
2086 | raise GitError('%s merge %s ' % (self.name, head)) | 2107 | raise GitError('%s merge %s ' % (self.name, head)) |
2087 | 2108 | ||
2088 | def _InitGitDir(self, mirror_git=None, MirrorOverride=False): | 2109 | def _InitGitDir(self, mirror_git=None): |
2089 | if not os.path.exists(self.gitdir): | 2110 | if not os.path.exists(self.gitdir): |
2090 | 2111 | ||
2091 | # Initialize the bare repository, which contains all of the objects. | 2112 | # Initialize the bare repository, which contains all of the objects. |
@@ -2127,38 +2148,11 @@ class Project(object): | |||
2127 | for key in ['user.name', 'user.email']: | 2148 | for key in ['user.name', 'user.email']: |
2128 | if m.Has(key, include_defaults=False): | 2149 | if m.Has(key, include_defaults=False): |
2129 | self.config.SetString(key, m.GetString(key)) | 2150 | self.config.SetString(key, m.GetString(key)) |
2130 | if self.manifest.IsMirror and not MirrorOverride: | 2151 | if self.manifest.IsMirror: |
2131 | self.config.SetString('core.bare', 'true') | 2152 | self.config.SetString('core.bare', 'true') |
2132 | else: | 2153 | else: |
2133 | self.config.SetString('core.bare', None) | 2154 | self.config.SetString('core.bare', None) |
2134 | 2155 | ||
2135 | def _ProjectHooks(self, remote, repodir): | ||
2136 | """List the hooks present in the 'hooks' directory. | ||
2137 | |||
2138 | These hooks are project hooks and are copied to the '.git/hooks' directory | ||
2139 | of all subprojects. | ||
2140 | |||
2141 | The remote projecthooks supplement/overrule any stockhook making it possible to | ||
2142 | have a combination of hooks both from the remote projecthook and | ||
2143 | .repo/hooks directories. | ||
2144 | |||
2145 | Returns: | ||
2146 | A list of absolute paths to all of the files in the hooks directory and | ||
2147 | projecthooks files, excluding the .git folder. | ||
2148 | """ | ||
2149 | hooks = {} | ||
2150 | d = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'hooks') | ||
2151 | hooks = dict([(x, os.path.join(d, x)) for x in os.listdir(d)]) | ||
2152 | if remote is not None: | ||
2153 | if remote.projecthookName is not None: | ||
2154 | d = os.path.abspath('%s/projecthooks/%s/%s' % (repodir, remote.name, remote.projecthookName)) | ||
2155 | if os.path.isdir(d): | ||
2156 | hooks.update(dict([(x, os.path.join(d, x)) for x in os.listdir(d)])) | ||
2157 | |||
2158 | if hooks.has_key('.git'): | ||
2159 | del hooks['.git'] | ||
2160 | return hooks.values() | ||
2161 | |||
2162 | def _UpdateHooks(self): | 2156 | def _UpdateHooks(self): |
2163 | if os.path.exists(self.gitdir): | 2157 | if os.path.exists(self.gitdir): |
2164 | self._InitHooks() | 2158 | self._InitHooks() |
@@ -2167,10 +2161,7 @@ class Project(object): | |||
2167 | hooks = os.path.realpath(self._gitdir_path('hooks')) | 2161 | hooks = os.path.realpath(self._gitdir_path('hooks')) |
2168 | if not os.path.exists(hooks): | 2162 | if not os.path.exists(hooks): |
2169 | os.makedirs(hooks) | 2163 | os.makedirs(hooks) |
2170 | pr = None | 2164 | for stock_hook in _ProjectHooks(): |
2171 | if self is not self.manifest.manifestProject: | ||
2172 | pr = self.manifest.remotes.get(self.remote.name) | ||
2173 | for stock_hook in self._ProjectHooks(pr, self.manifest.repodir): | ||
2174 | name = os.path.basename(stock_hook) | 2165 | name = os.path.basename(stock_hook) |
2175 | 2166 | ||
2176 | if name in ('commit-msg',) and not self.remote.review \ | 2167 | if name in ('commit-msg',) and not self.remote.review \ |