diff options
Diffstat (limited to 'project.py')
-rw-r--r-- | project.py | 57 |
1 files changed, 33 insertions, 24 deletions
@@ -69,27 +69,6 @@ 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 | |||
93 | class DownloadedChange(object): | 72 | class DownloadedChange(object): |
94 | _commit_cache = None | 73 | _commit_cache = None |
95 | 74 | ||
@@ -2091,7 +2070,7 @@ class Project(object): | |||
2091 | if GitCommand(self, cmd).Wait() != 0: | 2070 | if GitCommand(self, cmd).Wait() != 0: |
2092 | raise GitError('%s merge %s ' % (self.name, head)) | 2071 | raise GitError('%s merge %s ' % (self.name, head)) |
2093 | 2072 | ||
2094 | def _InitGitDir(self, mirror_git=None): | 2073 | def _InitGitDir(self, mirror_git=None, MirrorOverride=False): |
2095 | if not os.path.exists(self.gitdir): | 2074 | if not os.path.exists(self.gitdir): |
2096 | 2075 | ||
2097 | # Initialize the bare repository, which contains all of the objects. | 2076 | # Initialize the bare repository, which contains all of the objects. |
@@ -2133,11 +2112,38 @@ class Project(object): | |||
2133 | for key in ['user.name', 'user.email']: | 2112 | for key in ['user.name', 'user.email']: |
2134 | if m.Has(key, include_defaults=False): | 2113 | if m.Has(key, include_defaults=False): |
2135 | self.config.SetString(key, m.GetString(key)) | 2114 | self.config.SetString(key, m.GetString(key)) |
2136 | if self.manifest.IsMirror: | 2115 | if self.manifest.IsMirror and not MirrorOverride: |
2137 | self.config.SetString('core.bare', 'true') | 2116 | self.config.SetString('core.bare', 'true') |
2138 | else: | 2117 | else: |
2139 | self.config.SetString('core.bare', None) | 2118 | self.config.SetString('core.bare', None) |
2140 | 2119 | ||
2120 | def _ProjectHooks(self, remote, repodir): | ||
2121 | """List the hooks present in the 'hooks' directory. | ||
2122 | |||
2123 | These hooks are project hooks and are copied to the '.git/hooks' directory | ||
2124 | of all subprojects. | ||
2125 | |||
2126 | The remote projecthooks supplement/overrule any stockhook making it possible to | ||
2127 | have a combination of hooks both from the remote projecthook and | ||
2128 | .repo/hooks directories. | ||
2129 | |||
2130 | Returns: | ||
2131 | A list of absolute paths to all of the files in the hooks directory and | ||
2132 | projecthooks files, excluding the .git folder. | ||
2133 | """ | ||
2134 | hooks = {} | ||
2135 | d = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'hooks') | ||
2136 | hooks = dict([(x, os.path.join(d, x)) for x in os.listdir(d)]) | ||
2137 | if remote is not None: | ||
2138 | if remote.projecthookName is not None: | ||
2139 | d = os.path.abspath('%s/projecthooks/%s/%s' % (repodir, remote.name, remote.projecthookName)) | ||
2140 | if os.path.isdir(d): | ||
2141 | hooks.update(dict([(x, os.path.join(d, x)) for x in os.listdir(d)])) | ||
2142 | |||
2143 | if hooks.has_key('.git'): | ||
2144 | del hooks['.git'] | ||
2145 | return hooks.values() | ||
2146 | |||
2141 | def _UpdateHooks(self): | 2147 | def _UpdateHooks(self): |
2142 | if os.path.exists(self.gitdir): | 2148 | if os.path.exists(self.gitdir): |
2143 | self._InitHooks() | 2149 | self._InitHooks() |
@@ -2146,7 +2152,10 @@ class Project(object): | |||
2146 | hooks = os.path.realpath(self._gitdir_path('hooks')) | 2152 | hooks = os.path.realpath(self._gitdir_path('hooks')) |
2147 | if not os.path.exists(hooks): | 2153 | if not os.path.exists(hooks): |
2148 | os.makedirs(hooks) | 2154 | os.makedirs(hooks) |
2149 | for stock_hook in _ProjectHooks(): | 2155 | pr = None |
2156 | if self is not self.manifest.manifestProject: | ||
2157 | pr = self.manifest.remotes.get(self.remote.name) | ||
2158 | for stock_hook in self._ProjectHooks(pr, self.manifest.repodir): | ||
2150 | name = os.path.basename(stock_hook) | 2159 | name = os.path.basename(stock_hook) |
2151 | 2160 | ||
2152 | if name in ('commit-msg',) and not self.remote.review \ | 2161 | if name in ('commit-msg',) and not self.remote.review \ |