summaryrefslogtreecommitdiffstats
path: root/subcmds
diff options
context:
space:
mode:
authorSimran Basi <sbasi@google.com>2015-08-20 12:19:28 -0700
committerDan Willemsen <dwillemsen@google.com>2015-08-28 10:53:05 -0700
commitb9a1b73425773dc97843f92aeee9c57c9a08c0f7 (patch)
tree592a3655e92af8c7265ba07e29ba35aa1a1a36a8 /subcmds
parentdc2545cad60d7e8bae894f5d60eaeb3cff7485ae (diff)
downloadgit-repo-b9a1b73425773dc97843f92aeee9c57c9a08c0f7.tar.gz
GITC: Add repo start support.
Add repo start support for GITC checkouts. If the user is in the GITC FS view, they can now run repo start to check out the sources and create a new working branch. When "repo start" is called on a GITC project, the revision tag is set to an empty string and saved in a new tag: old-revision. This tells the GITC filesystem to display the local copy of the sources when being viewed. The local copy is created by pulling the project sources and the new branch is created based off the original project revision. Updated main.py to setup each command's gitc_manifest when appropriate. Updated repo sync's logic to sync opened projects and updating the GITC manifest file for the rest. Change-Id: I7e4809d1c4fc43c69b26f2f1bebe45aab0cae628
Diffstat (limited to 'subcmds')
-rw-r--r--subcmds/start.py42
-rw-r--r--subcmds/sync.py44
2 files changed, 67 insertions, 19 deletions
diff --git a/subcmds/start.py b/subcmds/start.py
index 60ad41e0..188fd7c6 100644
--- a/subcmds/start.py
+++ b/subcmds/start.py
@@ -14,11 +14,15 @@
14# limitations under the License. 14# limitations under the License.
15 15
16from __future__ import print_function 16from __future__ import print_function
17import os
17import sys 18import sys
19
18from command import Command 20from command import Command
19from git_config import IsId 21from git_config import IsId
20from git_command import git 22from git_command import git
23import gitc_utils
21from progress import Progress 24from progress import Progress
25from project import SyncBuffer
22 26
23class Start(Command): 27class Start(Command):
24 common = True 28 common = True
@@ -53,20 +57,50 @@ revision specified in the manifest.
53 print("error: at least one project must be specified", file=sys.stderr) 57 print("error: at least one project must be specified", file=sys.stderr)
54 sys.exit(1) 58 sys.exit(1)
55 59
56 all_projects = self.GetProjects(projects) 60 proj_name_to_gitc_proj_dict = {}
61 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
70 proj_name_to_gitc_proj_dict[project.name] = project
71 project.revisionExpr = None
72 # Save the GITC manifest.
73 gitc_utils.save_manifest(self.gitc_manifest)
57 74
75 all_projects = self.GetProjects(projects,
76 missing_ok=bool(self.gitc_manifest))
58 pm = Progress('Starting %s' % nb, len(all_projects)) 77 pm = Progress('Starting %s' % nb, len(all_projects))
59 for project in all_projects: 78 for project in all_projects:
60 pm.update() 79 pm.update()
80 if self.gitc_manifest:
81 gitc_project = proj_name_to_gitc_proj_dict[project.name]
82 # Sync projects that have already been opened.
83 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)
92 project.revisionExpr = gitc_project.old_revision
93
61 # If the current revision is a specific SHA1 then we can't push back 94 # If the current revision is a specific SHA1 then we can't push back
62 # to it; so substitute with dest_branch if defined, or with manifest 95 # to it; so substitute with dest_branch if defined, or with manifest
63 # default revision instead. 96 # default revision instead.
97 branch_merge = ''
64 if IsId(project.revisionExpr): 98 if IsId(project.revisionExpr):
65 if project.dest_branch: 99 if project.dest_branch:
66 project.revisionExpr = project.dest_branch 100 branch_merge = project.dest_branch
67 else: 101 else:
68 project.revisionExpr = self.manifest.default.revisionExpr 102 branch_merge = self.manifest.default.revisionExpr
69 if not project.StartBranch(nb): 103 if not project.StartBranch(nb, branch_merge=branch_merge):
70 err.append(project) 104 err.append(project)
71 pm.end() 105 pm.end()
72 106
diff --git a/subcmds/sync.py b/subcmds/sync.py
index ad0ecdf4..934aaa80 100644
--- a/subcmds/sync.py
+++ b/subcmds/sync.py
@@ -549,15 +549,6 @@ later is required to fix a server side protocol bug.
549 cwd.split(gitc_utils.GITC_MANIFEST_DIR)[1])) 549 cwd.split(gitc_utils.GITC_MANIFEST_DIR)[1]))
550 sys.exit(1) 550 sys.exit(1)
551 551
552 self._gitc_sync = False
553 if cwd.startswith(gitc_utils.GITC_FS_ROOT_DIR):
554 self._gitc_sync = True
555 self._client_name = cwd.split(gitc_utils.GITC_FS_ROOT_DIR)[1].split(
556 '/')[0]
557 self._client_dir = os.path.join(gitc_utils.GITC_MANIFEST_DIR,
558 self._client_name)
559 print('Updating GITC client: %s' % self._client_name)
560
561 if opt.manifest_name: 552 if opt.manifest_name:
562 self.manifest.Override(opt.manifest_name) 553 self.manifest.Override(opt.manifest_name)
563 554
@@ -677,12 +668,6 @@ later is required to fix a server side protocol bug.
677 if opt.repo_upgraded: 668 if opt.repo_upgraded:
678 _PostRepoUpgrade(self.manifest, quiet=opt.quiet) 669 _PostRepoUpgrade(self.manifest, quiet=opt.quiet)
679 670
680 if self._gitc_sync:
681 gitc_utils.generate_gitc_manifest(self._client_dir, self.manifest)
682 print('GITC client successfully synced.')
683 return
684
685
686 if not opt.local_only: 671 if not opt.local_only:
687 mp.Sync_NetworkHalf(quiet=opt.quiet, 672 mp.Sync_NetworkHalf(quiet=opt.quiet,
688 current_branch_only=opt.current_branch_only, 673 current_branch_only=opt.current_branch_only,
@@ -697,6 +682,35 @@ later is required to fix a server side protocol bug.
697 self._ReloadManifest(manifest_name) 682 self._ReloadManifest(manifest_name)
698 if opt.jobs is None: 683 if opt.jobs is None:
699 self.jobs = self.manifest.default.sync_j 684 self.jobs = self.manifest.default.sync_j
685
686 # TODO (sbasi) - Add support for manifest changes, aka projects
687 # have been added or deleted from the manifest.
688 if self.gitc_manifest:
689 gitc_manifest_projects = self.GetProjects(args,
690 manifest=self.gitc_manifest,
691 missing_ok=True)
692 gitc_projects = []
693 opened_projects = []
694 for project in gitc_manifest_projects:
695 if not project.old_revision:
696 gitc_projects.append(project)
697 else:
698 opened_projects.append(project)
699
700 if gitc_projects and not opt.local_only:
701 print('Updating GITC client: %s' % self.gitc_manifest.gitc_client_name)
702 gitc_utils.generate_gitc_manifest(self.gitc_manifest.gitc_client_dir,
703 self.gitc_manifest,
704 gitc_projects)
705 print('GITC client successfully synced.')
706
707 # The opened projects need to be synced as normal, therefore we
708 # generate a new args list to represent the opened projects.
709 args = []
710 for proj in opened_projects:
711 args.append(os.path.relpath(proj.worktree, cwd))
712 if not args:
713 return
700 all_projects = self.GetProjects(args, 714 all_projects = self.GetProjects(args,
701 missing_ok=True, 715 missing_ok=True,
702 submodules_ok=opt.fetch_submodules) 716 submodules_ok=opt.fetch_submodules)