blob: 188fd7c64883fdcbcc69abe4f42194b85afa5d3e [file] [log] [blame]
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -07001#
2# Copyright (C) 2008 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
Sarah Owenscecd1d82012-11-01 22:59:27 -070016from __future__ import print_function
Simran Basib9a1b732015-08-20 12:19:28 -070017import os
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070018import sys
Simran Basib9a1b732015-08-20 12:19:28 -070019
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070020from command import Command
Chad Jones87636f22012-06-14 16:53:40 -070021from git_config import IsId
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070022from git_command import git
Simran Basib9a1b732015-08-20 12:19:28 -070023import gitc_utils
Shawn O. Pearce0f0dfa32009-04-18 14:53:39 -070024from progress import Progress
Simran Basib9a1b732015-08-20 12:19:28 -070025from project import SyncBuffer
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070026
27class Start(Command):
28 common = True
29 helpSummary = "Start a new branch for development"
30 helpUsage = """
Ficus Kirkpatrick6f6cd772009-04-22 17:27:12 -070031%prog <newbranchname> [--all | <project>...]
Shawn O. Pearce06e556d2009-04-18 11:19:01 -070032"""
33 helpDescription = """
34'%prog' begins a new branch of development, starting from the
35revision specified in the manifest.
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070036"""
37
Ficus Kirkpatrick6f6cd772009-04-22 17:27:12 -070038 def _Options(self, p):
39 p.add_option('--all',
40 dest='all', action='store_true',
41 help='begin branch in all projects')
42
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070043 def Execute(self, opt, args):
44 if not args:
45 self.Usage()
46
47 nb = args[0]
48 if not git.check_ref_format('heads/%s' % nb):
Sarah Owenscecd1d82012-11-01 22:59:27 -070049 print("error: '%s' is not a valid name" % nb, file=sys.stderr)
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070050 sys.exit(1)
51
Shawn O. Pearce0a389e92009-04-10 16:21:18 -070052 err = []
Ficus Kirkpatrick6f6cd772009-04-22 17:27:12 -070053 projects = []
54 if not opt.all:
55 projects = args[1:]
56 if len(projects) < 1:
Sarah Owenscecd1d82012-11-01 22:59:27 -070057 print("error: at least one project must be specified", file=sys.stderr)
Ficus Kirkpatrick6f6cd772009-04-22 17:27:12 -070058 sys.exit(1)
59
Dan Willemsen03755232015-09-09 21:43:32 +000060 proj_name_to_gitc_proj_dict = {}
Simran Basib9a1b732015-08-20 12:19:28 -070061 if self.gitc_manifest:
62 all_projects = self.GetProjects(projects, manifest=self.gitc_manifest,
63 missing_ok=True)
64 for project in all_projects:
65 if project.old_revision:
66 project.already_synced = True
67 else:
68 project.already_synced = False
69 project.old_revision = project.revisionExpr
Dan Willemsen03755232015-09-09 21:43:32 +000070 proj_name_to_gitc_proj_dict[project.name] = project
Simran Basib9a1b732015-08-20 12:19:28 -070071 project.revisionExpr = None
72 # Save the GITC manifest.
73 gitc_utils.save_manifest(self.gitc_manifest)
Shawn O. Pearce0f0dfa32009-04-18 14:53:39 -070074
Simran Basib9a1b732015-08-20 12:19:28 -070075 all_projects = self.GetProjects(projects,
76 missing_ok=bool(self.gitc_manifest))
David Pursehouse8a68ff92012-09-24 12:15:13 +090077 pm = Progress('Starting %s' % nb, len(all_projects))
78 for project in all_projects:
Shawn O. Pearce0f0dfa32009-04-18 14:53:39 -070079 pm.update()
Simran Basib9a1b732015-08-20 12:19:28 -070080 if self.gitc_manifest:
Dan Willemsen03755232015-09-09 21:43:32 +000081 gitc_project = proj_name_to_gitc_proj_dict[project.name]
82 # Sync projects that have already been opened.
Simran Basib9a1b732015-08-20 12:19:28 -070083 if not gitc_project.already_synced:
84 proj_localdir = os.path.join(self.gitc_manifest.gitc_client_dir,
85 project.relpath)
86 project.worktree = proj_localdir
87 if not os.path.exists(proj_localdir):
88 os.makedirs(proj_localdir)
89 project.Sync_NetworkHalf()
90 sync_buf = SyncBuffer(self.manifest.manifestProject.config)
91 project.Sync_LocalHalf(sync_buf)
Dan Willemsen03755232015-09-09 21:43:32 +000092 project.revisionExpr = gitc_project.old_revision
Simran Basib9a1b732015-08-20 12:19:28 -070093
Chad Jones87636f22012-06-14 16:53:40 -070094 # If the current revision is a specific SHA1 then we can't push back
Max Liu5fb8ed22014-06-23 14:48:16 +080095 # to it; so substitute with dest_branch if defined, or with manifest
96 # default revision instead.
Simran Basib9a1b732015-08-20 12:19:28 -070097 branch_merge = ''
Chad Jones87636f22012-06-14 16:53:40 -070098 if IsId(project.revisionExpr):
Max Liu5fb8ed22014-06-23 14:48:16 +080099 if project.dest_branch:
Simran Basib9a1b732015-08-20 12:19:28 -0700100 branch_merge = project.dest_branch
Max Liu5fb8ed22014-06-23 14:48:16 +0800101 else:
Simran Basib9a1b732015-08-20 12:19:28 -0700102 branch_merge = self.manifest.default.revisionExpr
103 if not project.StartBranch(nb, branch_merge=branch_merge):
Shawn O. Pearce0a389e92009-04-10 16:21:18 -0700104 err.append(project)
Shawn O. Pearce0f0dfa32009-04-18 14:53:39 -0700105 pm.end()
Shawn O. Pearce0a389e92009-04-10 16:21:18 -0700106
107 if err:
Shawn O. Pearce0a389e92009-04-10 16:21:18 -0700108 for p in err:
Sarah Owenscecd1d82012-11-01 22:59:27 -0700109 print("error: %s/: cannot start %s" % (p.relpath, nb),
110 file=sys.stderr)
Shawn O. Pearce0a389e92009-04-10 16:21:18 -0700111 sys.exit(1)