1843 status = self.status(match=match, clean=force) |
1843 status = self.status(match=match, clean=force) |
1844 if force: |
1844 if force: |
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: |
1903 self.checkcommitpatterns(wctx, vdirs, match, status, fail) |
1853 self.checkcommitpatterns(wctx, vdirs, match, status, fail) |
1904 |
1854 |