diff options
| -rw-r--r-- | gitc_utils.py | 12 | ||||
| -rwxr-xr-x | repo | 38 | ||||
| -rw-r--r-- | subcmds/gitc_init.py | 18 | ||||
| -rw-r--r-- | tests/fixtures/gitc_config | 1 | ||||
| -rw-r--r-- | tests/test_wrapper.py | 75 |
5 files changed, 119 insertions, 25 deletions
diff --git a/gitc_utils.py b/gitc_utils.py index dd38f890..0f3e1818 100644 --- a/gitc_utils.py +++ b/gitc_utils.py | |||
| @@ -24,23 +24,13 @@ import git_command | |||
| 24 | import git_config | 24 | import git_config |
| 25 | import wrapper | 25 | import wrapper |
| 26 | 26 | ||
| 27 | GITC_FS_ROOT_DIR = '/gitc/manifest-rw/' | ||
| 28 | NUM_BATCH_RETRIEVE_REVISIONID = 300 | 27 | NUM_BATCH_RETRIEVE_REVISIONID = 300 |
| 29 | 28 | ||
| 30 | def get_gitc_manifest_dir(): | 29 | def get_gitc_manifest_dir(): |
| 31 | return wrapper.Wrapper().get_gitc_manifest_dir() | 30 | return wrapper.Wrapper().get_gitc_manifest_dir() |
| 32 | 31 | ||
| 33 | def parse_clientdir(gitc_fs_path): | 32 | def parse_clientdir(gitc_fs_path): |
| 34 | """Parse a path in the GITC FS and return its client name. | 33 | return wrapper.Wrapper().gitc_parse_clientdir(gitc_fs_path) |
| 35 | |||
| 36 | @param gitc_fs_path: A subdirectory path within the GITC_FS_ROOT_DIR. | ||
| 37 | |||
| 38 | @returns: The GITC client name | ||
| 39 | """ | ||
| 40 | if (gitc_fs_path == GITC_FS_ROOT_DIR or | ||
| 41 | not gitc_fs_path.startswith(GITC_FS_ROOT_DIR)): | ||
| 42 | return None | ||
| 43 | return gitc_fs_path.split(GITC_FS_ROOT_DIR)[1].split('/')[0] | ||
| 44 | 34 | ||
| 45 | def _set_project_revisions(projects): | 35 | def _set_project_revisions(projects): |
| 46 | """Sets the revisionExpr for a list of projects. | 36 | """Sets the revisionExpr for a list of projects. |
| @@ -109,6 +109,7 @@ S_manifests = 'manifests' # special manifest repository | |||
| 109 | REPO_MAIN = S_repo + '/main.py' # main script | 109 | REPO_MAIN = S_repo + '/main.py' # main script |
| 110 | MIN_PYTHON_VERSION = (2, 6) # minimum supported python version | 110 | MIN_PYTHON_VERSION = (2, 6) # minimum supported python version |
| 111 | GITC_CONFIG_FILE = '/gitc/.config' | 111 | GITC_CONFIG_FILE = '/gitc/.config' |
| 112 | GITC_FS_ROOT_DIR = '/gitc/manifest-rw/' | ||
| 112 | 113 | ||
| 113 | 114 | ||
| 114 | import errno | 115 | import errno |
| @@ -221,7 +222,7 @@ def _GitcInitOptions(init_optparse): | |||
| 221 | help='Optional manifest file to use for this GITC client.') | 222 | help='Optional manifest file to use for this GITC client.') |
| 222 | g.add_option('-c', '--gitc-client', | 223 | g.add_option('-c', '--gitc-client', |
| 223 | dest='gitc_client', | 224 | dest='gitc_client', |
| 224 | help='The name for the new gitc_client instance.') | 225 | help='The name of the gitc_client instance to create or modify.') |
| 225 | 226 | ||
| 226 | _gitc_manifest_dir = None | 227 | _gitc_manifest_dir = None |
| 227 | def get_gitc_manifest_dir(): | 228 | def get_gitc_manifest_dir(): |
| @@ -238,6 +239,28 @@ def get_gitc_manifest_dir(): | |||
| 238 | pass | 239 | pass |
| 239 | return _gitc_manifest_dir | 240 | return _gitc_manifest_dir |
| 240 | 241 | ||
| 242 | def gitc_parse_clientdir(gitc_fs_path): | ||
| 243 | """Parse a path in the GITC FS and return its client name. | ||
| 244 | |||
| 245 | @param gitc_fs_path: A subdirectory path within the GITC_FS_ROOT_DIR. | ||
| 246 | |||
| 247 | @returns: The GITC client name | ||
| 248 | """ | ||
| 249 | if gitc_fs_path == GITC_FS_ROOT_DIR: | ||
| 250 | return None | ||
| 251 | if not gitc_fs_path.startswith(GITC_FS_ROOT_DIR): | ||
| 252 | manifest_dir = get_gitc_manifest_dir() | ||
| 253 | if manifest_dir == '': | ||
| 254 | return None | ||
| 255 | if manifest_dir[-1] != '/': | ||
| 256 | manifest_dir += '/' | ||
| 257 | if gitc_fs_path == manifest_dir: | ||
| 258 | return None | ||
| 259 | if not gitc_fs_path.startswith(manifest_dir): | ||
| 260 | return None | ||
| 261 | return gitc_fs_path.split(manifest_dir)[1].split('/')[0] | ||
| 262 | return gitc_fs_path.split(GITC_FS_ROOT_DIR)[1].split('/')[0] | ||
| 263 | |||
| 241 | class CloneFailure(Exception): | 264 | class CloneFailure(Exception): |
| 242 | """Indicate the remote clone of repo itself failed. | 265 | """Indicate the remote clone of repo itself failed. |
| 243 | """ | 266 | """ |
| @@ -276,10 +299,13 @@ def _Init(args, gitc_init=False): | |||
| 276 | _print('fatal: GITC filesystem is not available. Exiting...', | 299 | _print('fatal: GITC filesystem is not available. Exiting...', |
| 277 | file=sys.stderr) | 300 | file=sys.stderr) |
| 278 | sys.exit(1) | 301 | sys.exit(1) |
| 279 | if not opt.gitc_client: | 302 | gitc_client = opt.gitc_client |
| 303 | if not gitc_client: | ||
| 304 | gitc_client = gitc_parse_clientdir(os.getcwd()) | ||
| 305 | if not gitc_client: | ||
| 280 | _print('fatal: GITC client (-c) is required.', file=sys.stderr) | 306 | _print('fatal: GITC client (-c) is required.', file=sys.stderr) |
| 281 | sys.exit(1) | 307 | sys.exit(1) |
| 282 | client_dir = os.path.join(gitc_manifest_dir, opt.gitc_client) | 308 | client_dir = os.path.join(gitc_manifest_dir, gitc_client) |
| 283 | if not os.path.exists(client_dir): | 309 | if not os.path.exists(client_dir): |
| 284 | os.makedirs(client_dir) | 310 | os.makedirs(client_dir) |
| 285 | os.chdir(client_dir) | 311 | os.chdir(client_dir) |
| @@ -772,9 +798,13 @@ def _SetDefaultsTo(gitdir): | |||
| 772 | 798 | ||
| 773 | 799 | ||
| 774 | def main(orig_args): | 800 | def main(orig_args): |
| 775 | repo_main, rel_repo_dir = _FindRepo() | ||
| 776 | cmd, opt, args = _ParseArguments(orig_args) | 801 | cmd, opt, args = _ParseArguments(orig_args) |
| 777 | 802 | ||
| 803 | repo_main, rel_repo_dir = None, None | ||
| 804 | # Don't use the local repo copy, make sure to switch to the gitc client first. | ||
| 805 | if cmd != 'gitc-init': | ||
| 806 | repo_main, rel_repo_dir = _FindRepo() | ||
| 807 | |||
| 778 | wrapper_path = os.path.abspath(__file__) | 808 | wrapper_path = os.path.abspath(__file__) |
| 779 | my_main, my_git = _RunSelf(wrapper_path) | 809 | my_main, my_git = _RunSelf(wrapper_path) |
| 780 | 810 | ||
diff --git a/subcmds/gitc_init.py b/subcmds/gitc_init.py index 4f9d7344..2726eaec 100644 --- a/subcmds/gitc_init.py +++ b/subcmds/gitc_init.py | |||
| @@ -21,6 +21,7 @@ import gitc_utils | |||
| 21 | from command import GitcAvailableCommand | 21 | from command import GitcAvailableCommand |
| 22 | from manifest_xml import GitcManifest | 22 | from manifest_xml import GitcManifest |
| 23 | from subcmds import init | 23 | from subcmds import init |
| 24 | import wrapper | ||
| 24 | 25 | ||
| 25 | 26 | ||
| 26 | class GitcInit(init.Init, GitcAvailableCommand): | 27 | class GitcInit(init.Init, GitcAvailableCommand): |
| @@ -55,18 +56,15 @@ use for this GITC client. | |||
| 55 | help='Optional manifest file to use for this GITC client.') | 56 | help='Optional manifest file to use for this GITC client.') |
| 56 | g.add_option('-c', '--gitc-client', | 57 | g.add_option('-c', '--gitc-client', |
| 57 | dest='gitc_client', | 58 | dest='gitc_client', |
| 58 | help='The name for the new gitc_client instance.') | 59 | help='The name of the gitc_client instance to create or modify.') |
| 59 | 60 | ||
| 60 | def Execute(self, opt, args): | 61 | def Execute(self, opt, args): |
| 61 | if not opt.gitc_client: | 62 | gitc_client = gitc_utils.parse_clientdir(os.getcwd()) |
| 62 | print('fatal: gitc client (-c) is required', file=sys.stderr) | 63 | if not gitc_client or (opt.gitc_client and gitc_client != opt.gitc_client): |
| 64 | print('fatal: Please update your repo command. See go/gitc for instructions.', file=sys.stderr) | ||
| 63 | sys.exit(1) | 65 | sys.exit(1) |
| 64 | self.client_dir = os.path.join(gitc_utils.get_gitc_manifest_dir(), | 66 | self.client_dir = os.path.join(gitc_utils.get_gitc_manifest_dir(), |
| 65 | opt.gitc_client) | 67 | gitc_client) |
| 66 | if not os.path.exists(gitc_utils.get_gitc_manifest_dir()): | ||
| 67 | os.makedirs(gitc_utils.get_gitc_manifest_dir()) | ||
| 68 | if not os.path.exists(self.client_dir): | ||
| 69 | os.mkdir(self.client_dir) | ||
| 70 | super(GitcInit, self).Execute(opt, args) | 68 | super(GitcInit, self).Execute(opt, args) |
| 71 | 69 | ||
| 72 | manifest_file = self.manifest.manifestFile | 70 | manifest_file = self.manifest.manifestFile |
| @@ -77,8 +75,8 @@ use for this GITC client. | |||
| 77 | sys.exit(1) | 75 | sys.exit(1) |
| 78 | manifest_file = opt.manifest_file | 76 | manifest_file = opt.manifest_file |
| 79 | 77 | ||
| 80 | manifest = GitcManifest(self.repodir, opt.gitc_client) | 78 | manifest = GitcManifest(self.repodir, gitc_client) |
| 81 | manifest.Override(manifest_file) | 79 | manifest.Override(manifest_file) |
| 82 | gitc_utils.generate_gitc_manifest(None, manifest) | 80 | gitc_utils.generate_gitc_manifest(None, manifest) |
| 83 | print('Please run `cd %s` to view your GITC client.' % | 81 | print('Please run `cd %s` to view your GITC client.' % |
| 84 | os.path.join(gitc_utils.GITC_FS_ROOT_DIR, opt.gitc_client)) | 82 | os.path.join(wrapper.Wrapper().GITC_FS_ROOT_DIR, gitc_client)) |
diff --git a/tests/fixtures/gitc_config b/tests/fixtures/gitc_config new file mode 100644 index 00000000..a7f3d1c9 --- /dev/null +++ b/tests/fixtures/gitc_config | |||
| @@ -0,0 +1 @@ | |||
| gitc_dir=/test/usr/local/google/gitc | |||
diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py new file mode 100644 index 00000000..fb32e38a --- /dev/null +++ b/tests/test_wrapper.py | |||
| @@ -0,0 +1,75 @@ | |||
| 1 | # | ||
| 2 | # Copyright (C) 2015 The Android Open Source Project | ||
| 3 | # | ||
| 4 | # Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | # you may not use this file except in compliance with the License. | ||
| 6 | # You may obtain a copy of the License at | ||
| 7 | # | ||
| 8 | # http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | # | ||
| 10 | # Unless required by applicable law or agreed to in writing, software | ||
| 11 | # distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | # See the License for the specific language governing permissions and | ||
| 14 | # limitations under the License. | ||
| 15 | |||
| 16 | import os | ||
| 17 | import unittest | ||
| 18 | |||
| 19 | import wrapper | ||
| 20 | |||
| 21 | def fixture(*paths): | ||
| 22 | """Return a path relative to tests/fixtures. | ||
| 23 | """ | ||
| 24 | return os.path.join(os.path.dirname(__file__), 'fixtures', *paths) | ||
| 25 | |||
| 26 | class RepoWrapperUnitTest(unittest.TestCase): | ||
| 27 | """Tests helper functions in the repo wrapper | ||
| 28 | """ | ||
| 29 | def setUp(self): | ||
| 30 | """Load the wrapper module every time | ||
| 31 | """ | ||
| 32 | wrapper._wrapper_module = None | ||
| 33 | self.wrapper = wrapper.Wrapper() | ||
| 34 | |||
| 35 | def test_get_gitc_manifest_dir_no_gitc(self): | ||
| 36 | """ | ||
| 37 | Test reading a missing gitc config file | ||
| 38 | """ | ||
| 39 | self.wrapper.GITC_CONFIG_FILE = fixture('missing_gitc_config') | ||
| 40 | val = self.wrapper.get_gitc_manifest_dir() | ||
| 41 | self.assertEqual(val, '') | ||
| 42 | |||
| 43 | def test_get_gitc_manifest_dir(self): | ||
| 44 | """ | ||
| 45 | Test reading the gitc config file and parsing the directory | ||
| 46 | """ | ||
| 47 | self.wrapper.GITC_CONFIG_FILE = fixture('gitc_config') | ||
| 48 | val = self.wrapper.get_gitc_manifest_dir() | ||
| 49 | self.assertEqual(val, '/test/usr/local/google/gitc') | ||
| 50 | |||
| 51 | def test_gitc_parse_clientdir_no_gitc(self): | ||
| 52 | """ | ||
| 53 | Test parsing the gitc clientdir without gitc running | ||
| 54 | """ | ||
| 55 | self.wrapper.GITC_CONFIG_FILE = fixture('missing_gitc_config') | ||
| 56 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/something'), None) | ||
| 57 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test'), 'test') | ||
| 58 | |||
| 59 | def test_gitc_parse_clientdir(self): | ||
| 60 | """ | ||
| 61 | Test parsing the gitc clientdir | ||
| 62 | """ | ||
| 63 | self.wrapper.GITC_CONFIG_FILE = fixture('gitc_config') | ||
| 64 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/something'), None) | ||
| 65 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test'), 'test') | ||
| 66 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test/'), 'test') | ||
| 67 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test/extra'), 'test') | ||
| 68 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/test'), 'test') | ||
| 69 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/test/'), 'test') | ||
| 70 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/test/extra'), 'test') | ||
| 71 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/'), None) | ||
| 72 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/'), None) | ||
| 73 | |||
| 74 | if __name__ == '__main__': | ||
| 75 | unittest.main() | ||
