6 # of the GNU General Public License, incorporated herein by reference. |
6 # of the GNU General Public License, incorporated herein by reference. |
7 |
7 |
8 from demandload import demandload |
8 from demandload import demandload |
9 from i18n import gettext as _ |
9 from i18n import gettext as _ |
10 from node import * |
10 from node import * |
11 demandload(globals(), "sys util") |
11 demandload(globals(), "os sys tempfile util") |
12 |
12 |
13 class sshserver(object): |
13 class sshserver(object): |
14 def __init__(self, ui, repo): |
14 def __init__(self, ui, repo): |
15 self.ui = ui |
15 self.ui = ui |
16 self.repo = repo |
16 self.repo = repo |
102 self.fout.write(d) |
106 self.fout.write(d) |
103 |
107 |
104 self.fout.flush() |
108 self.fout.flush() |
105 |
109 |
106 def do_addchangegroup(self): |
110 def do_addchangegroup(self): |
|
111 '''DEPRECATED''' |
|
112 |
107 if not self.lock: |
113 if not self.lock: |
108 self.respond("not locked") |
114 self.respond("not locked") |
109 return |
115 return |
110 |
116 |
111 self.respond("") |
117 self.respond("") |
112 r = self.repo.addchangegroup(self.fin, 'serve') |
118 r = self.repo.addchangegroup(self.fin, 'serve') |
113 self.respond(str(r)) |
119 self.respond(str(r)) |
|
120 |
|
121 def do_unbundle(self): |
|
122 their_heads = self.getarg()[1].split() |
|
123 |
|
124 def check_heads(): |
|
125 heads = map(hex, self.repo.heads()) |
|
126 return their_heads == [hex('force')] or their_heads == heads |
|
127 |
|
128 # fail early if possible |
|
129 if not check_heads(): |
|
130 self.respond(_('unsynced changes')) |
|
131 return |
|
132 |
|
133 self.respond('') |
|
134 |
|
135 # write bundle data to temporary file because it can be big |
|
136 |
|
137 try: |
|
138 fd, tempname = tempfile.mkstemp(prefix='hg-unbundle-') |
|
139 fp = os.fdopen(fd, 'wb+') |
|
140 |
|
141 count = int(self.fin.readline()) |
|
142 while count: |
|
143 fp.write(self.fin.read(count)) |
|
144 count = int(self.fin.readline()) |
|
145 |
|
146 was_locked = self.lock is not None |
|
147 if not was_locked: |
|
148 self.lock = self.repo.lock() |
|
149 try: |
|
150 if not check_heads(): |
|
151 # someone else committed/pushed/unbundled while we |
|
152 # were transferring data |
|
153 self.respond(_('unsynced changes')) |
|
154 return |
|
155 self.respond('') |
|
156 |
|
157 # push can proceed |
|
158 |
|
159 fp.seek(0) |
|
160 r = self.repo.addchangegroup(fp, 'serve') |
|
161 self.respond(str(r)) |
|
162 finally: |
|
163 if not was_locked: |
|
164 self.lock.release() |
|
165 self.lock = None |
|
166 finally: |
|
167 fp.close() |
|
168 os.unlink(tempname) |
|
169 |