diff options
| -rw-r--r-- | project.py | 101 | ||||
| -rwxr-xr-x | repo | 5 | ||||
| -rw-r--r-- | subcmds/init.py | 14 |
3 files changed, 111 insertions, 9 deletions
| @@ -622,13 +622,14 @@ class Project(object): | |||
| 622 | """Perform only the network IO portion of the sync process. | 622 | """Perform only the network IO portion of the sync process. |
| 623 | Local working directory/branch state is not affected. | 623 | Local working directory/branch state is not affected. |
| 624 | """ | 624 | """ |
| 625 | if not self.Exists: | 625 | is_new = not self.Exists |
| 626 | if is_new: | ||
| 626 | print >>sys.stderr | 627 | print >>sys.stderr |
| 627 | print >>sys.stderr, 'Initializing project %s ...' % self.name | 628 | print >>sys.stderr, 'Initializing project %s ...' % self.name |
| 628 | self._InitGitDir() | 629 | self._InitGitDir() |
| 629 | 630 | ||
| 630 | self._InitRemote() | 631 | self._InitRemote() |
| 631 | if not self._RemoteFetch(): | 632 | if not self._RemoteFetch(initial = is_new): |
| 632 | return False | 633 | return False |
| 633 | 634 | ||
| 634 | #Check that the requested ref was found after fetch | 635 | #Check that the requested ref was found after fetch |
| @@ -1024,7 +1025,7 @@ class Project(object): | |||
| 1024 | 1025 | ||
| 1025 | ## Direct Git Commands ## | 1026 | ## Direct Git Commands ## |
| 1026 | 1027 | ||
| 1027 | def _RemoteFetch(self, name=None, tag=None): | 1028 | def _RemoteFetch(self, name=None, tag=None, initial=False): |
| 1028 | if not name: | 1029 | if not name: |
| 1029 | name = self.remote.name | 1030 | name = self.remote.name |
| 1030 | 1031 | ||
| @@ -1032,6 +1033,60 @@ class Project(object): | |||
| 1032 | if self.GetRemote(name).PreConnectFetch(): | 1033 | if self.GetRemote(name).PreConnectFetch(): |
| 1033 | ssh_proxy = True | 1034 | ssh_proxy = True |
| 1034 | 1035 | ||
| 1036 | if initial: | ||
| 1037 | alt = os.path.join(self.gitdir, 'objects/info/alternates') | ||
| 1038 | try: | ||
| 1039 | fd = open(alt, 'rb') | ||
| 1040 | try: | ||
| 1041 | ref_dir = fd.readline() | ||
| 1042 | if ref_dir and ref_dir.endswith('\n'): | ||
| 1043 | ref_dir = ref_dir[:-1] | ||
| 1044 | finally: | ||
| 1045 | fd.close() | ||
| 1046 | except IOError, e: | ||
| 1047 | ref_dir = None | ||
| 1048 | |||
| 1049 | if ref_dir and 'objects' == os.path.basename(ref_dir): | ||
| 1050 | ref_dir = os.path.dirname(ref_dir) | ||
| 1051 | packed_refs = os.path.join(self.gitdir, 'packed-refs') | ||
| 1052 | remote = self.GetRemote(name) | ||
| 1053 | |||
| 1054 | all = self.bare_ref.all | ||
| 1055 | ids = set(all.values()) | ||
| 1056 | tmp = set() | ||
| 1057 | |||
| 1058 | for r, id in GitRefs(ref_dir).all.iteritems(): | ||
| 1059 | if r not in all: | ||
| 1060 | if r.startswith(R_TAGS) or remote.WritesTo(r): | ||
| 1061 | all[r] = id | ||
| 1062 | ids.add(id) | ||
| 1063 | continue | ||
| 1064 | |||
| 1065 | if id in ids: | ||
| 1066 | continue | ||
| 1067 | |||
| 1068 | r = 'refs/_alt/%s' % id | ||
| 1069 | all[r] = id | ||
| 1070 | ids.add(id) | ||
| 1071 | tmp.add(r) | ||
| 1072 | |||
| 1073 | ref_names = list(all.keys()) | ||
| 1074 | ref_names.sort() | ||
| 1075 | |||
| 1076 | tmp_packed = '' | ||
| 1077 | old_packed = '' | ||
| 1078 | |||
| 1079 | for r in ref_names: | ||
| 1080 | line = '%s %s\n' % (all[r], r) | ||
| 1081 | tmp_packed += line | ||
| 1082 | if r not in tmp: | ||
| 1083 | old_packed += line | ||
| 1084 | |||
| 1085 | _lwrite(packed_refs, tmp_packed) | ||
| 1086 | |||
| 1087 | else: | ||
| 1088 | ref_dir = None | ||
| 1089 | |||
| 1035 | cmd = ['fetch'] | 1090 | cmd = ['fetch'] |
| 1036 | if not self.worktree: | 1091 | if not self.worktree: |
| 1037 | cmd.append('--update-head-ok') | 1092 | cmd.append('--update-head-ok') |
| @@ -1039,10 +1094,21 @@ class Project(object): | |||
| 1039 | if tag is not None: | 1094 | if tag is not None: |
| 1040 | cmd.append('tag') | 1095 | cmd.append('tag') |
| 1041 | cmd.append(tag) | 1096 | cmd.append(tag) |
| 1042 | return GitCommand(self, | 1097 | |
| 1043 | cmd, | 1098 | ok = GitCommand(self, |
| 1044 | bare = True, | 1099 | cmd, |
| 1045 | ssh_proxy = ssh_proxy).Wait() == 0 | 1100 | bare = True, |
| 1101 | ssh_proxy = ssh_proxy).Wait() == 0 | ||
| 1102 | |||
| 1103 | if initial: | ||
| 1104 | if ref_dir: | ||
| 1105 | if old_packed != '': | ||
| 1106 | _lwrite(packed_refs, old_packed) | ||
| 1107 | else: | ||
| 1108 | os.remove(packed_refs) | ||
| 1109 | self.bare_git.pack_refs('--all', '--prune') | ||
| 1110 | |||
| 1111 | return ok | ||
| 1046 | 1112 | ||
| 1047 | def _Checkout(self, rev, quiet=False): | 1113 | def _Checkout(self, rev, quiet=False): |
| 1048 | cmd = ['checkout'] | 1114 | cmd = ['checkout'] |
| @@ -1080,6 +1146,27 @@ class Project(object): | |||
| 1080 | os.makedirs(self.gitdir) | 1146 | os.makedirs(self.gitdir) |
| 1081 | self.bare_git.init() | 1147 | self.bare_git.init() |
| 1082 | 1148 | ||
| 1149 | mp = self.manifest.manifestProject | ||
| 1150 | ref_dir = mp.config.GetString('repo.reference') | ||
| 1151 | |||
| 1152 | if ref_dir: | ||
| 1153 | mirror_git = os.path.join(ref_dir, self.name + '.git') | ||
| 1154 | repo_git = os.path.join(ref_dir, '.repo', 'projects', | ||
| 1155 | self.relpath + '.git') | ||
| 1156 | |||
| 1157 | if os.path.exists(mirror_git): | ||
| 1158 | ref_dir = mirror_git | ||
| 1159 | |||
| 1160 | elif os.path.exists(repo_git): | ||
| 1161 | ref_dir = repo_git | ||
| 1162 | |||
| 1163 | else: | ||
| 1164 | ref_dir = None | ||
| 1165 | |||
| 1166 | if ref_dir: | ||
| 1167 | _lwrite(os.path.join(self.gitdir, 'objects/info/alternates'), | ||
| 1168 | os.path.join(ref_dir, 'objects') + '\n') | ||
| 1169 | |||
| 1083 | if self.manifest.IsMirror: | 1170 | if self.manifest.IsMirror: |
| 1084 | self.config.SetString('core.bare', 'true') | 1171 | self.config.SetString('core.bare', 'true') |
| 1085 | else: | 1172 | else: |
| @@ -28,7 +28,7 @@ if __name__ == '__main__': | |||
| 28 | del magic | 28 | del magic |
| 29 | 29 | ||
| 30 | # increment this whenever we make important changes to this script | 30 | # increment this whenever we make important changes to this script |
| 31 | VERSION = (1, 8) | 31 | VERSION = (1, 9) |
| 32 | 32 | ||
| 33 | # increment this if the MAINTAINER_KEYS block is modified | 33 | # increment this if the MAINTAINER_KEYS block is modified |
| 34 | KEYRING_VERSION = (1,0) | 34 | KEYRING_VERSION = (1,0) |
| @@ -118,6 +118,9 @@ group.add_option('-m', '--manifest-name', | |||
| 118 | group.add_option('--mirror', | 118 | group.add_option('--mirror', |
| 119 | dest='mirror', action='store_true', | 119 | dest='mirror', action='store_true', |
| 120 | help='mirror the forrest') | 120 | help='mirror the forrest') |
| 121 | group.add_option('--reference', | ||
| 122 | dest='reference', | ||
| 123 | help='location of mirror directory', metavar='DIR') | ||
| 121 | 124 | ||
| 122 | # Tool | 125 | # Tool |
| 123 | group = init_optparse.add_option_group('repo Version options') | 126 | group = init_optparse.add_option_group('repo Version options') |
diff --git a/subcmds/init.py b/subcmds/init.py index 4023ab6d..17edfa05 100644 --- a/subcmds/init.py +++ b/subcmds/init.py | |||
| @@ -41,6 +41,13 @@ The optional -m argument can be used to specify an alternate manifest | |||
| 41 | to be used. If no manifest is specified, the manifest default.xml | 41 | to be used. If no manifest is specified, the manifest default.xml |
| 42 | will be used. | 42 | will be used. |
| 43 | 43 | ||
| 44 | The --reference option can be used to point to a directory that | ||
| 45 | has the content of a --mirror sync. This will make the working | ||
| 46 | directory use as much data as possible from the local reference | ||
| 47 | directory when fetching from the server. This will make the sync | ||
| 48 | go a lot faster by reducing data traffic on the network. | ||
| 49 | |||
| 50 | |||
| 44 | Switching Manifest Branches | 51 | Switching Manifest Branches |
| 45 | --------------------------- | 52 | --------------------------- |
| 46 | 53 | ||
| @@ -71,7 +78,9 @@ to update the working directory files. | |||
| 71 | g.add_option('--mirror', | 78 | g.add_option('--mirror', |
| 72 | dest='mirror', action='store_true', | 79 | dest='mirror', action='store_true', |
| 73 | help='mirror the forrest') | 80 | help='mirror the forrest') |
| 74 | 81 | g.add_option('--reference', | |
| 82 | dest='reference', | ||
| 83 | help='location of mirror directory', metavar='DIR') | ||
| 75 | 84 | ||
| 76 | # Tool | 85 | # Tool |
| 77 | g = p.add_option_group('repo Version options') | 86 | g = p.add_option_group('repo Version options') |
| @@ -115,6 +124,9 @@ to update the working directory files. | |||
| 115 | r.ResetFetch() | 124 | r.ResetFetch() |
| 116 | r.Save() | 125 | r.Save() |
| 117 | 126 | ||
| 127 | if opt.reference: | ||
| 128 | m.config.SetString('repo.reference', opt.reference) | ||
| 129 | |||
| 118 | if opt.mirror: | 130 | if opt.mirror: |
| 119 | if is_new: | 131 | if is_new: |
| 120 | m.config.SetString('repo.mirror', 'true') | 132 | m.config.SetString('repo.mirror', 'true') |
