152 lfdirstate = largefiles_dirstate(opener, ui, repo.root, |
152 lfdirstate = largefiles_dirstate(opener, ui, repo.root, |
153 repo.dirstate._validate) |
153 repo.dirstate._validate) |
154 |
154 |
155 # If the largefiles dirstate does not exist, populate and create |
155 # If the largefiles dirstate does not exist, populate and create |
156 # it. This ensures that we create it on the first meaningful |
156 # it. This ensures that we create it on the first meaningful |
157 # largefiles operation in a new clone. It also gives us an easy |
157 # largefiles operation in a new clone. |
158 # way to forcibly rebuild largefiles state: |
|
159 # rm .hg/largefiles/dirstate && hg status |
|
160 # Or even, if things are really messed up: |
|
161 # rm -rf .hg/largefiles && hg status |
|
162 if not os.path.exists(os.path.join(admin, 'dirstate')): |
158 if not os.path.exists(os.path.join(admin, 'dirstate')): |
163 util.makedirs(admin) |
159 util.makedirs(admin) |
164 matcher = getstandinmatcher(repo) |
160 matcher = getstandinmatcher(repo) |
165 for standin in dirstate_walk(repo.dirstate, matcher): |
161 for standin in dirstate_walk(repo.dirstate, matcher): |
166 lfile = splitstandin(standin) |
162 lfile = splitstandin(standin) |
170 if hash == hashfile(repo.wjoin(lfile)): |
166 if hash == hashfile(repo.wjoin(lfile)): |
171 lfdirstate.normal(lfile) |
167 lfdirstate.normal(lfile) |
172 except OSError, err: |
168 except OSError, err: |
173 if err.errno != errno.ENOENT: |
169 if err.errno != errno.ENOENT: |
174 raise |
170 raise |
175 |
|
176 lfdirstate.write() |
|
177 |
|
178 return lfdirstate |
171 return lfdirstate |
179 |
172 |
180 def lfdirstate_status(lfdirstate, repo, rev): |
173 def lfdirstate_status(lfdirstate, repo, rev): |
181 wlock = repo.wlock() |
174 match = match_.always(repo.root, repo.getcwd()) |
182 try: |
175 s = lfdirstate.status(match, [], False, False, False) |
183 match = match_.always(repo.root, repo.getcwd()) |
176 unsure, modified, added, removed, missing, unknown, ignored, clean = s |
184 s = lfdirstate.status(match, [], False, False, False) |
177 for lfile in unsure: |
185 unsure, modified, added, removed, missing, unknown, ignored, clean = s |
178 if repo[rev][standin(lfile)].data().strip() != \ |
186 for lfile in unsure: |
179 hashfile(repo.wjoin(lfile)): |
187 if repo[rev][standin(lfile)].data().strip() != \ |
180 modified.append(lfile) |
188 hashfile(repo.wjoin(lfile)): |
181 else: |
189 modified.append(lfile) |
182 clean.append(lfile) |
190 else: |
183 lfdirstate.normal(lfile) |
191 clean.append(lfile) |
|
192 lfdirstate.normal(lfile) |
|
193 lfdirstate.write() |
|
194 finally: |
|
195 wlock.release() |
|
196 return (modified, added, removed, missing, unknown, ignored, clean) |
184 return (modified, added, removed, missing, unknown, ignored, clean) |
197 |
185 |
198 def listlfiles(repo, rev=None, matcher=None): |
186 def listlfiles(repo, rev=None, matcher=None): |
199 '''return a list of largefiles in the working copy or the |
187 '''return a list of largefiles in the working copy or the |
200 specified changeset''' |
188 specified changeset''' |