70 def sendstream(self, source): |
70 def sendstream(self, source): |
71 for chunk in source: |
71 for chunk in source: |
72 self.fout.write(chunk) |
72 self.fout.write(chunk) |
73 self.fout.flush() |
73 self.fout.flush() |
74 |
74 |
|
75 def getfile(self, fpout): |
|
76 self.respond('') |
|
77 count = int(self.fin.readline()) |
|
78 while count: |
|
79 fpout.write(self.fin.read(count)) |
|
80 count = int(self.fin.readline()) |
|
81 |
|
82 def redirect(self): |
|
83 pass |
|
84 |
|
85 def respondpush(self, ret): |
|
86 self.respond('') |
|
87 self.respond(str(ret)) |
|
88 |
75 def serve_forever(self): |
89 def serve_forever(self): |
76 try: |
90 try: |
77 while self.serve_one(): |
91 while self.serve_one(): |
78 pass |
92 pass |
79 finally: |
93 finally: |
125 if not self.lock: |
139 if not self.lock: |
126 self.respond("not locked") |
140 self.respond("not locked") |
127 return |
141 return |
128 |
142 |
129 self.respond("") |
143 self.respond("") |
130 r = self.repo.addchangegroup(self.fin, 'serve', self.client_url(), |
144 r = self.repo.addchangegroup(self.fin, 'serve', self._client(), |
131 lock=self.lock) |
145 lock=self.lock) |
132 return str(r) |
146 return str(r) |
133 |
147 |
134 def client_url(self): |
148 def _client(self): |
135 client = os.environ.get('SSH_CLIENT', '').split(' ', 1)[0] |
149 client = os.environ.get('SSH_CLIENT', '').split(' ', 1)[0] |
136 return 'remote:ssh:' + client |
150 return 'remote:ssh:' + client |
137 |
|
138 def do_unbundle(self): |
|
139 their_heads = self.getarg('heads').split() |
|
140 |
|
141 def check_heads(): |
|
142 heads = map(hex, self.repo.heads()) |
|
143 return their_heads == [hex('force')] or their_heads == heads |
|
144 |
|
145 # fail early if possible |
|
146 if not check_heads(): |
|
147 self.respond(_('unsynced changes')) |
|
148 return |
|
149 |
|
150 self.respond('') |
|
151 |
|
152 # write bundle data to temporary file because it can be big |
|
153 fd, tempname = tempfile.mkstemp(prefix='hg-unbundle-') |
|
154 fp = os.fdopen(fd, 'wb+') |
|
155 try: |
|
156 count = int(self.fin.readline()) |
|
157 while count: |
|
158 fp.write(self.fin.read(count)) |
|
159 count = int(self.fin.readline()) |
|
160 |
|
161 was_locked = self.lock is not None |
|
162 if not was_locked: |
|
163 self.lock = self.repo.lock() |
|
164 try: |
|
165 if not check_heads(): |
|
166 # someone else committed/pushed/unbundled while we |
|
167 # were transferring data |
|
168 self.respond(_('unsynced changes')) |
|
169 return |
|
170 self.respond('') |
|
171 |
|
172 # push can proceed |
|
173 |
|
174 fp.seek(0) |
|
175 r = self.repo.addchangegroup(fp, 'serve', self.client_url(), |
|
176 lock=self.lock) |
|
177 self.respond(str(r)) |
|
178 finally: |
|
179 if not was_locked: |
|
180 self.lock.release() |
|
181 self.lock = None |
|
182 finally: |
|
183 fp.close() |
|
184 os.unlink(tempname) |
|