summaryrefslogtreecommitdiffstats
path: root/subcmds
diff options
context:
space:
mode:
Diffstat (limited to 'subcmds')
-rw-r--r--subcmds/forall.py5
-rw-r--r--subcmds/gitc_init.py80
-rw-r--r--subcmds/list.py5
-rw-r--r--subcmds/sync.py29
4 files changed, 117 insertions, 2 deletions
diff --git a/subcmds/forall.py b/subcmds/forall.py
index b93cd6d0..96dc99d1 100644
--- a/subcmds/forall.py
+++ b/subcmds/forall.py
@@ -120,6 +120,9 @@ without iterating through the remaining projects.
120 p.add_option('-r', '--regex', 120 p.add_option('-r', '--regex',
121 dest='regex', action='store_true', 121 dest='regex', action='store_true',
122 help="Execute the command only on projects matching regex or wildcard expression") 122 help="Execute the command only on projects matching regex or wildcard expression")
123 p.add_option('-g', '--groups',
124 dest='groups',
125 help="Execute the command only on projects matching the specified groups")
123 p.add_option('-c', '--command', 126 p.add_option('-c', '--command',
124 help='Command (and arguments) to execute', 127 help='Command (and arguments) to execute',
125 dest='command', 128 dest='command',
@@ -213,7 +216,7 @@ without iterating through the remaining projects.
213 self.manifest.Override(smart_sync_manifest_path) 216 self.manifest.Override(smart_sync_manifest_path)
214 217
215 if not opt.regex: 218 if not opt.regex:
216 projects = self.GetProjects(args) 219 projects = self.GetProjects(args, groups=opt.groups)
217 else: 220 else:
218 projects = self.FindProjects(args) 221 projects = self.FindProjects(args)
219 222
diff --git a/subcmds/gitc_init.py b/subcmds/gitc_init.py
new file mode 100644
index 00000000..03d8cc30
--- /dev/null
+++ b/subcmds/gitc_init.py
@@ -0,0 +1,80 @@
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
16from __future__ import print_function
17import os
18import shutil
19import sys
20
21import gitc_utils
22from subcmds import init
23
24
25class GitcInit(init.Init):
26 common = True
27 helpSummary = "Initialize a GITC Client."
28 helpUsage = """
29%prog [options] [client name]
30"""
31 helpDescription = """
32The '%prog' command is ran to initialize a new GITC client for use
33with the GITC file system.
34
35This command will setup the client directory, initialize repo, just
36like repo init does, and then downloads the manifest collection
37and installs in in the .repo/directory of the GITC client.
38
39Once this is done, a GITC manifest is generated by pulling the HEAD
40SHA for each project and generates the properly formatted XML file
41and installs it as .manifest in the GITC client directory.
42
43The -c argument is required to specify the GITC client name.
44
45The optional -f argument can be used to specify the manifest file to
46use for this GITC client.
47"""
48
49 def _Options(self, p):
50 super(GitcInit, self)._Options(p)
51 g = p.add_option_group('GITC options')
52 g.add_option('-f', '--manifest-file',
53 dest='manifest_file',
54 help='Optional manifest file to use for this GITC client.')
55 g.add_option('-c', '--gitc-client',
56 dest='gitc_client',
57 help='The name for the new gitc_client instance.')
58
59 def Execute(self, opt, args):
60 if not opt.gitc_client:
61 print('fatal: gitc client (-c) is required', file=sys.stderr)
62 sys.exit(1)
63 self.client_dir = os.path.join(gitc_utils.GITC_MANIFEST_DIR,
64 opt.gitc_client)
65 if not os.path.exists(gitc_utils.GITC_MANIFEST_DIR):
66 os.makedirs(gitc_utils.GITC_MANIFEST_DIR)
67 if not os.path.exists(self.client_dir):
68 os.mkdir(self.client_dir)
69 super(GitcInit, self).Execute(opt, args)
70 # Make the destination manifest file a symlink to repo's so both repo and
71 # GITC refer to the same manifest.
72 if opt.manifest_file:
73 if not os.path.exists(opt.manifest_file):
74 print('fatal: Specified manifest file %s does not exist.' %
75 opt.manifest_file)
76 sys.exit(1)
77 self.manifest.Override(opt.manifest_file)
78 gitc_utils.generate_gitc_manifest(self.client_dir, self.manifest)
79 print('Please run `cd %s` to view your GITC client.' %
80 os.path.join(gitc_utils.GITC_FS_ROOT_DIR, opt.gitc_client)) \ No newline at end of file
diff --git a/subcmds/list.py b/subcmds/list.py
index 945c28d8..ca51c5f7 100644
--- a/subcmds/list.py
+++ b/subcmds/list.py
@@ -35,6 +35,9 @@ This is similar to running: repo forall -c 'echo "$REPO_PATH : $REPO_PROJECT"'.
35 p.add_option('-r', '--regex', 35 p.add_option('-r', '--regex',
36 dest='regex', action='store_true', 36 dest='regex', action='store_true',
37 help="Filter the project list based on regex or wildcard matching of strings") 37 help="Filter the project list based on regex or wildcard matching of strings")
38 p.add_option('-g', '--groups',
39 dest='groups',
40 help="Filter the project list based on the groups the project is in")
38 p.add_option('-f', '--fullpath', 41 p.add_option('-f', '--fullpath',
39 dest='fullpath', action='store_true', 42 dest='fullpath', action='store_true',
40 help="Display the full work tree path instead of the relative path") 43 help="Display the full work tree path instead of the relative path")
@@ -62,7 +65,7 @@ This is similar to running: repo forall -c 'echo "$REPO_PATH : $REPO_PROJECT"'.
62 sys.exit(1) 65 sys.exit(1)
63 66
64 if not opt.regex: 67 if not opt.regex:
65 projects = self.GetProjects(args) 68 projects = self.GetProjects(args, groups=opt.groups)
66 else: 69 else:
67 projects = self.FindProjects(args) 70 projects = self.FindProjects(args)
68 71
diff --git a/subcmds/sync.py b/subcmds/sync.py
index 43d450be..652a0c0d 100644
--- a/subcmds/sync.py
+++ b/subcmds/sync.py
@@ -58,6 +58,7 @@ except ImportError:
58 58
59from git_command import GIT, git_require 59from git_command import GIT, git_require
60from git_refs import R_HEADS, HEAD 60from git_refs import R_HEADS, HEAD
61import gitc_utils
61from project import Project 62from project import Project
62from project import RemoteSpec 63from project import RemoteSpec
63from command import Command, MirrorSafeCommand 64from command import Command, MirrorSafeCommand
@@ -184,6 +185,9 @@ later is required to fix a server side protocol bug.
184 help="overwrite an existing git directory if it needs to " 185 help="overwrite an existing git directory if it needs to "
185 "point to a different object directory. WARNING: this " 186 "point to a different object directory. WARNING: this "
186 "may cause loss of data") 187 "may cause loss of data")
188 p.add_option('--force-gitc',
189 dest='force_gitc', action='store_true',
190 help="actually sync sources in the gitc client directory.")
187 p.add_option('-l', '--local-only', 191 p.add_option('-l', '--local-only',
188 dest='local_only', action='store_true', 192 dest='local_only', action='store_true',
189 help="only update working tree, don't fetch") 193 help="only update working tree, don't fetch")
@@ -526,6 +530,25 @@ later is required to fix a server side protocol bug.
526 print('error: both -u and -p must be given', file=sys.stderr) 530 print('error: both -u and -p must be given', file=sys.stderr)
527 sys.exit(1) 531 sys.exit(1)
528 532
533 cwd = os.getcwd()
534 if cwd.startswith(gitc_utils.GITC_MANIFEST_DIR) and not opt.force_gitc:
535 print('WARNING this will pull all the sources like a normal repo sync.\n'
536 '\nIf you want to update your GITC Client View please rerun this '
537 'command in \n%s%s.\nOr if you actually want to pull the sources, '
538 'rerun with --force-gitc.' %
539 (gitc_utils.GITC_FS_ROOT_DIR,
540 cwd.split(gitc_utils.GITC_MANIFEST_DIR)[1]))
541 sys.exit(1)
542
543 self._gitc_sync = False
544 if cwd.startswith(gitc_utils.GITC_FS_ROOT_DIR):
545 self._gitc_sync = True
546 self._client_name = cwd.split(gitc_utils.GITC_FS_ROOT_DIR)[1].split(
547 '/')[0]
548 self._client_dir = os.path.join(gitc_utils.GITC_MANIFEST_DIR,
549 self._client_name)
550 print('Updating GITC client: %s' % self._client_name)
551
529 if opt.manifest_name: 552 if opt.manifest_name:
530 self.manifest.Override(opt.manifest_name) 553 self.manifest.Override(opt.manifest_name)
531 554
@@ -642,6 +665,12 @@ later is required to fix a server side protocol bug.
642 if opt.repo_upgraded: 665 if opt.repo_upgraded:
643 _PostRepoUpgrade(self.manifest, quiet=opt.quiet) 666 _PostRepoUpgrade(self.manifest, quiet=opt.quiet)
644 667
668 if self._gitc_sync:
669 gitc_utils.generate_gitc_manifest(self._client_dir, self.manifest)
670 print('GITC client successfully synced.')
671 return
672
673
645 if not opt.local_only: 674 if not opt.local_only:
646 mp.Sync_NetworkHalf(quiet=opt.quiet, 675 mp.Sync_NetworkHalf(quiet=opt.quiet,
647 current_branch_only=opt.current_branch_only, 676 current_branch_only=opt.current_branch_only,