Show More
@@ -1845,58 +1845,8 class localrepository(object): | |||||
1845 | status.modified.extend(status.clean) # mq may commit clean files |
|
1845 | status.modified.extend(status.clean) # mq may commit clean files | |
1846 |
|
1846 | |||
1847 | # check subrepos |
|
1847 | # check subrepos | |
1848 | subs = [] |
|
1848 | subs, commitsubs, newstate = subrepo.precommit( | |
1849 | commitsubs = set() |
|
1849 | self.ui, wctx, status, match, force=force) | |
1850 | newstate = wctx.substate.copy() |
|
|||
1851 | # only manage subrepos and .hgsubstate if .hgsub is present |
|
|||
1852 | if '.hgsub' in wctx: |
|
|||
1853 | # we'll decide whether to track this ourselves, thanks |
|
|||
1854 | for c in status.modified, status.added, status.removed: |
|
|||
1855 | if '.hgsubstate' in c: |
|
|||
1856 | c.remove('.hgsubstate') |
|
|||
1857 |
|
||||
1858 | # compare current state to last committed state |
|
|||
1859 | # build new substate based on last committed state |
|
|||
1860 | oldstate = wctx.p1().substate |
|
|||
1861 | for s in sorted(newstate.keys()): |
|
|||
1862 | if not match(s): |
|
|||
1863 | # ignore working copy, use old state if present |
|
|||
1864 | if s in oldstate: |
|
|||
1865 | newstate[s] = oldstate[s] |
|
|||
1866 | continue |
|
|||
1867 | if not force: |
|
|||
1868 | raise error.Abort( |
|
|||
1869 | _("commit with new subrepo %s excluded") % s) |
|
|||
1870 | dirtyreason = wctx.sub(s).dirtyreason(True) |
|
|||
1871 | if dirtyreason: |
|
|||
1872 | if not self.ui.configbool('ui', 'commitsubrepos'): |
|
|||
1873 | raise error.Abort(dirtyreason, |
|
|||
1874 | hint=_("use --subrepos for recursive commit")) |
|
|||
1875 | subs.append(s) |
|
|||
1876 | commitsubs.add(s) |
|
|||
1877 | else: |
|
|||
1878 | bs = wctx.sub(s).basestate() |
|
|||
1879 | newstate[s] = (newstate[s][0], bs, newstate[s][2]) |
|
|||
1880 | if oldstate.get(s, (None, None, None))[1] != bs: |
|
|||
1881 | subs.append(s) |
|
|||
1882 |
|
||||
1883 | # check for removed subrepos |
|
|||
1884 | for p in wctx.parents(): |
|
|||
1885 | r = [s for s in p.substate if s not in newstate] |
|
|||
1886 | subs += [s for s in r if match(s)] |
|
|||
1887 | if subs: |
|
|||
1888 | if (not match('.hgsub') and |
|
|||
1889 | '.hgsub' in (wctx.modified() + wctx.added())): |
|
|||
1890 | raise error.Abort( |
|
|||
1891 | _("can't commit subrepos without .hgsub")) |
|
|||
1892 | status.modified.insert(0, '.hgsubstate') |
|
|||
1893 |
|
||||
1894 | elif '.hgsub' in status.removed: |
|
|||
1895 | # clean up .hgsubstate when .hgsub is removed |
|
|||
1896 | if ('.hgsubstate' in wctx and |
|
|||
1897 | '.hgsubstate' not in (status.modified + status.added + |
|
|||
1898 | status.removed)): |
|
|||
1899 | status.removed.insert(0, '.hgsubstate') |
|
|||
1900 |
|
1850 | |||
1901 | # make sure all explicit patterns are matched |
|
1851 | # make sure all explicit patterns are matched | |
1902 | if not force: |
|
1852 | if not force: |
@@ -293,6 +293,71 def submerge(repo, wctx, mctx, actx, ove | |||||
293 | writestate(repo, sm) |
|
293 | writestate(repo, sm) | |
294 | return sm |
|
294 | return sm | |
295 |
|
295 | |||
|
296 | def precommit(ui, wctx, status, match, force=False): | |||
|
297 | """Calculate .hgsubstate changes that should be applied before committing | |||
|
298 | ||||
|
299 | Returns (subs, commitsubs, newstate) where | |||
|
300 | - subs: changed subrepos (including dirty ones) | |||
|
301 | - commitsubs: dirty subrepos which the caller needs to commit recursively | |||
|
302 | - newstate: new state dict which the caller must write to .hgsubstate | |||
|
303 | ||||
|
304 | This also updates the given status argument. | |||
|
305 | """ | |||
|
306 | subs = [] | |||
|
307 | commitsubs = set() | |||
|
308 | newstate = wctx.substate.copy() | |||
|
309 | ||||
|
310 | # only manage subrepos and .hgsubstate if .hgsub is present | |||
|
311 | if '.hgsub' in wctx: | |||
|
312 | # we'll decide whether to track this ourselves, thanks | |||
|
313 | for c in status.modified, status.added, status.removed: | |||
|
314 | if '.hgsubstate' in c: | |||
|
315 | c.remove('.hgsubstate') | |||
|
316 | ||||
|
317 | # compare current state to last committed state | |||
|
318 | # build new substate based on last committed state | |||
|
319 | oldstate = wctx.p1().substate | |||
|
320 | for s in sorted(newstate.keys()): | |||
|
321 | if not match(s): | |||
|
322 | # ignore working copy, use old state if present | |||
|
323 | if s in oldstate: | |||
|
324 | newstate[s] = oldstate[s] | |||
|
325 | continue | |||
|
326 | if not force: | |||
|
327 | raise error.Abort( | |||
|
328 | _("commit with new subrepo %s excluded") % s) | |||
|
329 | dirtyreason = wctx.sub(s).dirtyreason(True) | |||
|
330 | if dirtyreason: | |||
|
331 | if not ui.configbool('ui', 'commitsubrepos'): | |||
|
332 | raise error.Abort(dirtyreason, | |||
|
333 | hint=_("use --subrepos for recursive commit")) | |||
|
334 | subs.append(s) | |||
|
335 | commitsubs.add(s) | |||
|
336 | else: | |||
|
337 | bs = wctx.sub(s).basestate() | |||
|
338 | newstate[s] = (newstate[s][0], bs, newstate[s][2]) | |||
|
339 | if oldstate.get(s, (None, None, None))[1] != bs: | |||
|
340 | subs.append(s) | |||
|
341 | ||||
|
342 | # check for removed subrepos | |||
|
343 | for p in wctx.parents(): | |||
|
344 | r = [s for s in p.substate if s not in newstate] | |||
|
345 | subs += [s for s in r if match(s)] | |||
|
346 | if subs: | |||
|
347 | if (not match('.hgsub') and | |||
|
348 | '.hgsub' in (wctx.modified() + wctx.added())): | |||
|
349 | raise error.Abort(_("can't commit subrepos without .hgsub")) | |||
|
350 | status.modified.insert(0, '.hgsubstate') | |||
|
351 | ||||
|
352 | elif '.hgsub' in status.removed: | |||
|
353 | # clean up .hgsubstate when .hgsub is removed | |||
|
354 | if ('.hgsubstate' in wctx and | |||
|
355 | '.hgsubstate' not in (status.modified + status.added + | |||
|
356 | status.removed)): | |||
|
357 | status.removed.insert(0, '.hgsubstate') | |||
|
358 | ||||
|
359 | return subs, commitsubs, newstate | |||
|
360 | ||||
296 | def _updateprompt(ui, sub, dirty, local, remote): |
|
361 | def _updateprompt(ui, sub, dirty, local, remote): | |
297 | if dirty: |
|
362 | if dirty: | |
298 | msg = (_(' subrepository sources for %s differ\n' |
|
363 | msg = (_(' subrepository sources for %s differ\n' |
General Comments 0
You need to be logged in to leave comments.
Login now