summaryrefslogtreecommitdiffstats
path: root/repo
diff options
context:
space:
mode:
Diffstat (limited to 'repo')
-rwxr-xr-xrepo38
1 files changed, 34 insertions, 4 deletions
diff --git a/repo b/repo
index 502bb324..d1c5427f 100755
--- a/repo
+++ b/repo
@@ -109,6 +109,7 @@ S_manifests = 'manifests' # special manifest repository
109REPO_MAIN = S_repo + '/main.py' # main script 109REPO_MAIN = S_repo + '/main.py' # main script
110MIN_PYTHON_VERSION = (2, 6) # minimum supported python version 110MIN_PYTHON_VERSION = (2, 6) # minimum supported python version
111GITC_CONFIG_FILE = '/gitc/.config' 111GITC_CONFIG_FILE = '/gitc/.config'
112GITC_FS_ROOT_DIR = '/gitc/manifest-rw/'
112 113
113 114
114import errno 115import 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
227def get_gitc_manifest_dir(): 228def 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
242def 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
241class CloneFailure(Exception): 264class 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
774def main(orig_args): 800def 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