diff options
Diffstat (limited to 'project.py')
| -rw-r--r-- | project.py | 68 |
1 files changed, 50 insertions, 18 deletions
| @@ -46,6 +46,32 @@ def _info(fmt, *args): | |||
| 46 | def not_rev(r): | 46 | def not_rev(r): |
| 47 | return '^' + r | 47 | return '^' + r |
| 48 | 48 | ||
| 49 | |||
| 50 | hook_list = None | ||
| 51 | def repo_hooks(): | ||
| 52 | global hook_list | ||
| 53 | if hook_list is None: | ||
| 54 | d = os.path.abspath(os.path.dirname(__file__)) | ||
| 55 | d = os.path.join(d , 'hooks') | ||
| 56 | hook_list = map(lambda x: os.path.join(d, x), os.listdir(d)) | ||
| 57 | return hook_list | ||
| 58 | |||
| 59 | def relpath(dst, src): | ||
| 60 | src = os.path.dirname(src) | ||
| 61 | top = os.path.commonprefix([dst, src]) | ||
| 62 | if top.endswith('/'): | ||
| 63 | top = top[:-1] | ||
| 64 | else: | ||
| 65 | top = os.path.dirname(top) | ||
| 66 | |||
| 67 | tmp = src | ||
| 68 | rel = '' | ||
| 69 | while top != tmp: | ||
| 70 | rel += '../' | ||
| 71 | tmp = os.path.dirname(tmp) | ||
| 72 | return rel + dst[len(top) + 1:] | ||
| 73 | |||
| 74 | |||
| 49 | class DownloadedChange(object): | 75 | class DownloadedChange(object): |
| 50 | _commit_cache = None | 76 | _commit_cache = None |
| 51 | 77 | ||
| @@ -472,7 +498,10 @@ class Project(object): | |||
| 472 | self._RepairAndroidImportErrors() | 498 | self._RepairAndroidImportErrors() |
| 473 | self._InitMRef() | 499 | self._InitMRef() |
| 474 | return True | 500 | return True |
| 475 | 501 | ||
| 502 | def PostRepoUpgrade(self): | ||
| 503 | self._InitHooks() | ||
| 504 | |||
| 476 | def _CopyFiles(self): | 505 | def _CopyFiles(self): |
| 477 | for file in self.copyfiles: | 506 | for file in self.copyfiles: |
| 478 | file._Copy() | 507 | file._Copy() |
| @@ -795,14 +824,29 @@ class Project(object): | |||
| 795 | to_rm = [] | 824 | to_rm = [] |
| 796 | for old_hook in to_rm: | 825 | for old_hook in to_rm: |
| 797 | os.remove(os.path.join(hooks, old_hook)) | 826 | os.remove(os.path.join(hooks, old_hook)) |
| 798 | 827 | self._InitHooks() | |
| 799 | # TODO(sop) install custom repo hooks | ||
| 800 | 828 | ||
| 801 | m = self.manifest.manifestProject.config | 829 | m = self.manifest.manifestProject.config |
| 802 | for key in ['user.name', 'user.email']: | 830 | for key in ['user.name', 'user.email']: |
| 803 | if m.Has(key, include_defaults = False): | 831 | if m.Has(key, include_defaults = False): |
| 804 | self.config.SetString(key, m.GetString(key)) | 832 | self.config.SetString(key, m.GetString(key)) |
| 805 | 833 | ||
| 834 | def _InitHooks(self): | ||
| 835 | hooks = self._gitdir_path('hooks') | ||
| 836 | if not os.path.exists(hooks): | ||
| 837 | os.makedirs(hooks) | ||
| 838 | for stock_hook in repo_hooks(): | ||
| 839 | dst = os.path.join(hooks, os.path.basename(stock_hook)) | ||
| 840 | try: | ||
| 841 | os.symlink(relpath(stock_hook, dst), dst) | ||
| 842 | except OSError, e: | ||
| 843 | if e.errno == errno.EEXIST: | ||
| 844 | pass | ||
| 845 | elif e.errno == errno.EPERM: | ||
| 846 | raise GitError('filesystem must support symlinks') | ||
| 847 | else: | ||
| 848 | raise | ||
| 849 | |||
| 806 | def _InitRemote(self): | 850 | def _InitRemote(self): |
| 807 | if self.remote.fetchUrl: | 851 | if self.remote.fetchUrl: |
| 808 | remote = self.GetRemote(self.remote.name) | 852 | remote = self.GetRemote(self.remote.name) |
| @@ -842,19 +886,6 @@ class Project(object): | |||
| 842 | if not os.path.exists(dotgit): | 886 | if not os.path.exists(dotgit): |
| 843 | os.makedirs(dotgit) | 887 | os.makedirs(dotgit) |
| 844 | 888 | ||
| 845 | topdir = os.path.commonprefix([self.gitdir, dotgit]) | ||
| 846 | if topdir.endswith('/'): | ||
| 847 | topdir = topdir[:-1] | ||
| 848 | else: | ||
| 849 | topdir = os.path.dirname(topdir) | ||
| 850 | |||
| 851 | tmpdir = dotgit | ||
| 852 | relgit = '' | ||
| 853 | while topdir != tmpdir: | ||
| 854 | relgit += '../' | ||
| 855 | tmpdir = os.path.dirname(tmpdir) | ||
| 856 | relgit += self.gitdir[len(topdir) + 1:] | ||
| 857 | |||
| 858 | for name in ['config', | 889 | for name in ['config', |
| 859 | 'description', | 890 | 'description', |
| 860 | 'hooks', | 891 | 'hooks', |
| @@ -866,8 +897,9 @@ class Project(object): | |||
| 866 | 'rr-cache', | 897 | 'rr-cache', |
| 867 | 'svn']: | 898 | 'svn']: |
| 868 | try: | 899 | try: |
| 869 | os.symlink(os.path.join(relgit, name), | 900 | src = os.path.join(self.gitdir, name) |
| 870 | os.path.join(dotgit, name)) | 901 | dst = os.path.join(dotgit, name) |
| 902 | os.symlink(relpath(src, dst), dst) | ||
| 871 | except OSError, e: | 903 | except OSError, e: |
| 872 | if e.errno == errno.EPERM: | 904 | if e.errno == errno.EPERM: |
| 873 | raise GitError('filesystem must support symlinks') | 905 | raise GitError('filesystem must support symlinks') |
