diff --git a/project.py b/project.py index fdbf9e4a..80b0cf8d 100644 --- a/project.py +++ b/project.py @@ -2311,6 +2311,27 @@ class Project(object): # Enable the extension! self.config.SetString('extensions.%s' % (key,), value) + def ResolveRemoteHead(self, name=None): + """Find out what the default branch (HEAD) points to. + + Normally this points to refs/heads/master, but projects are moving to main. + Support whatever the server uses rather than hardcoding "master" ourselves. + """ + if name is None: + name = self.remote.name + + # The output will look like (NB: tabs are separators): + # ref: refs/heads/master HEAD + # 5f6803b100bb3cd0f534e96e88c91373e8ed1c44 HEAD + output = self.bare_git.ls_remote('-q', '--symref', '--exit-code', name, 'HEAD') + + for line in output.splitlines(): + lhs, rhs = line.split('\t', 1) + if rhs == 'HEAD' and lhs.startswith('ref:'): + return lhs[4:].strip() + + return None + def _CheckForImmutableRevision(self): try: # if revision (sha or tag) is not present then following function diff --git a/subcmds/init.py b/subcmds/init.py index 41578076..5ba0d074 100644 --- a/subcmds/init.py +++ b/subcmds/init.py @@ -54,7 +54,8 @@ from the server and is installed in the .repo/ directory in the current working directory. The optional -b argument can be used to select the manifest branch -to checkout and use. If no branch is specified, master is assumed. +to checkout and use. If no branch is specified, the remote's default +branch is used. The optional -m argument can be used to specify an alternate manifest to be used. If no manifest is specified, the manifest default.xml @@ -215,24 +216,27 @@ to update the working directory files. m._InitGitDir(mirror_git=mirrored_manifest_git) - if opt.manifest_branch: - m.revisionExpr = opt.manifest_branch - else: - m.revisionExpr = 'refs/heads/master' - else: - if opt.manifest_branch: - m.revisionExpr = opt.manifest_branch - else: - m.PreSync() - self._ConfigureDepth(opt) + # Set the remote URL before the remote branch as we might need it below. if opt.manifest_url: r = m.GetRemote(m.remote.name) r.url = opt.manifest_url r.ResetFetch() r.Save() + if opt.manifest_branch: + m.revisionExpr = opt.manifest_branch + else: + if is_new: + default_branch = m.ResolveRemoteHead() + if default_branch is None: + # If the remote doesn't have HEAD configured, default to master. + default_branch = 'refs/heads/master' + m.revisionExpr = default_branch + else: + m.PreSync() + groups = re.split(r'[,\s]+', opt.groups) all_platforms = ['linux', 'darwin', 'windows'] platformize = lambda x: 'platform-' + x