From 5d016502ebc68bc054d85c98c6cdb51e0b63a1f5 Mon Sep 17 00:00:00 2001 From: Florian Vallee Date: Thu, 7 Jun 2012 17:19:26 +0200 Subject: [PATCH] Fix switching manifest branches using repo init -b See repo issue #46 : https://code.google.com/p/git-repo/issues/detail?id=46 When using repo init -b on an already existing repository, the next sync will try to rebase changes coming from the old manifest branch onto the new, leading in the best case scenario to conflicts and in the worst case scenario to an incorrect "mixed up" manifest. This patch fixes this by deleting the "default" branch in the local manifest repository when the -d init switch is used, thus forcing repo to perform a fresh checkout of the new manifest branch Change-Id: I379e4875ec5357d8614d1197b6afbe58f9606751 --- project.py | 16 ++++++++++++++++ subcmds/init.py | 3 +++ 2 files changed, 19 insertions(+) diff --git a/project.py b/project.py index 4f0345f8..d336f990 100644 --- a/project.py +++ b/project.py @@ -2167,6 +2167,22 @@ class MetaProject(Project): self.revisionExpr = base self.revisionId = None + def MetaBranchSwitch(self, target): + """ Prepare MetaProject for manifest branch switch + """ + + # detach and delete manifest branch, allowing a new + # branch to take over + syncbuf = SyncBuffer(self.config, detach_head = True) + self.Sync_LocalHalf(syncbuf) + syncbuf.Finish() + + return GitCommand(self, + ['branch', '-D', 'default'], + capture_stdout = True, + capture_stderr = True).Wait() == 0 + + @property def LastFetch(self): try: diff --git a/subcmds/init.py b/subcmds/init.py index b359024d..a758fbb1 100644 --- a/subcmds/init.py +++ b/subcmds/init.py @@ -187,6 +187,9 @@ to update the working directory files. shutil.rmtree(m.gitdir) sys.exit(1) + if opt.manifest_branch: + m.MetaBranchSwitch(opt.manifest_branch) + syncbuf = SyncBuffer(m.config) m.Sync_LocalHalf(syncbuf) syncbuf.Finish()