comparison hgext/mq.py @ 9067:2ebac2bf7ad5

mq: wrapped docstrings at 78 characters
author Martin Geisler <mg@lazybytes.net>
date Tue, 07 Jul 2009 23:54:42 +0200
parents 1fa80c5428b8
children 561ff8d9e4f0
comparison
equal deleted inserted replaced
9066:11b111e9acd3 9067:2ebac2bf7ad5
6 # GNU General Public License version 2, incorporated herein by reference. 6 # GNU General Public License version 2, incorporated herein by reference.
7 7
8 '''manage a stack of patches 8 '''manage a stack of patches
9 9
10 This extension lets you work with a stack of patches in a Mercurial 10 This extension lets you work with a stack of patches in a Mercurial
11 repository. It manages two stacks of patches - all known patches, and 11 repository. It manages two stacks of patches - all known patches, and applied
12 applied patches (subset of known patches). 12 patches (subset of known patches).
13 13
14 Known patches are represented as patch files in the .hg/patches 14 Known patches are represented as patch files in the .hg/patches directory.
15 directory. Applied patches are both patch files and changesets. 15 Applied patches are both patch files and changesets.
16 16
17 Common tasks (use "hg help command" for more details): 17 Common tasks (use "hg help command" for more details):
18 18
19 prepare repository to work with patches qinit 19 prepare repository to work with patches qinit
20 create new patch qnew 20 create new patch qnew
1679 q.qseries(repo, start=start, status='U', summary=opts.get('summary')) 1679 q.qseries(repo, start=start, status='U', summary=opts.get('summary'))
1680 1680
1681 def qimport(ui, repo, *filename, **opts): 1681 def qimport(ui, repo, *filename, **opts):
1682 """import a patch 1682 """import a patch
1683 1683
1684 The patch is inserted into the series after the last applied 1684 The patch is inserted into the series after the last applied patch. If no
1685 patch. If no patches have been applied, qimport prepends the patch 1685 patches have been applied, qimport prepends the patch to the series.
1686 to the series. 1686
1687 1687 The patch will have the same name as its source file unless you give it a
1688 The patch will have the same name as its source file unless you 1688 new one with -n/--name.
1689 give it a new one with -n/--name. 1689
1690 1690 You can register an existing patch inside the patch directory with the
1691 You can register an existing patch inside the patch directory with 1691 -e/--existing flag.
1692 the -e/--existing flag. 1692
1693 1693 With -f/--force, an existing patch of the same name will be overwritten.
1694 With -f/--force, an existing patch of the same name will be 1694
1695 overwritten. 1695 An existing changeset may be placed under mq control with -r/--rev (e.g.
1696 1696 qimport --rev tip -n patch will place tip under mq control). With
1697 An existing changeset may be placed under mq control with -r/--rev 1697 -g/--git, patches imported with --rev will use the git diff format. See
1698 (e.g. qimport --rev tip -n patch will place tip under mq control). 1698 the diffs help topic for information on why this is important for
1699 With -g/--git, patches imported with --rev will use the git diff 1699 preserving rename/copy information and permission changes.
1700 format. See the diffs help topic for information on why this is 1700
1701 important for preserving rename/copy information and permission 1701 To import a patch from standard input, pass - as the patch file. When
1702 changes. 1702 importing from standard input, a patch name must be specified using the
1703 1703 --name flag.
1704 To import a patch from standard input, pass - as the patch file.
1705 When importing from standard input, a patch name must be specified
1706 using the --name flag.
1707 """ 1704 """
1708 q = repo.mq 1705 q = repo.mq
1709 q.qimport(repo, filename, patchname=opts['name'], 1706 q.qimport(repo, filename, patchname=opts['name'],
1710 existing=opts['existing'], force=opts['force'], rev=opts['rev'], 1707 existing=opts['existing'], force=opts['force'], rev=opts['rev'],
1711 git=opts['git']) 1708 git=opts['git'])
1716 return 0 1713 return 0
1717 1714
1718 def init(ui, repo, **opts): 1715 def init(ui, repo, **opts):
1719 """init a new queue repository 1716 """init a new queue repository
1720 1717
1721 The queue repository is unversioned by default. If 1718 The queue repository is unversioned by default. If -c/--create-repo is
1722 -c/--create-repo is specified, qinit will create a separate nested 1719 specified, qinit will create a separate nested repository for patches
1723 repository for patches (qinit -c may also be run later to convert 1720 (qinit -c may also be run later to convert an unversioned patch repository
1724 an unversioned patch repository into a versioned one). You can use 1721 into a versioned one). You can use qcommit to commit changes to this queue
1725 qcommit to commit changes to this queue repository.""" 1722 repository.
1723 """
1726 q = repo.mq 1724 q = repo.mq
1727 r = q.init(repo, create=opts['create_repo']) 1725 r = q.init(repo, create=opts['create_repo'])
1728 q.save_dirty() 1726 q.save_dirty()
1729 if r: 1727 if r:
1730 if not os.path.exists(r.wjoin('.hgignore')): 1728 if not os.path.exists(r.wjoin('.hgignore')):
1742 return 0 1740 return 0
1743 1741
1744 def clone(ui, source, dest=None, **opts): 1742 def clone(ui, source, dest=None, **opts):
1745 '''clone main and patch repository at same time 1743 '''clone main and patch repository at same time
1746 1744
1747 If source is local, destination will have no patches applied. If 1745 If source is local, destination will have no patches applied. If source is
1748 source is remote, this command can not check if patches are 1746 remote, this command can not check if patches are applied in source, so
1749 applied in source, so cannot guarantee that patches are not 1747 cannot guarantee that patches are not applied in destination. If you clone
1750 applied in destination. If you clone remote repository, be sure 1748 remote repository, be sure before that it has no patches applied.
1751 before that it has no patches applied. 1749
1752 1750 Source patch repository is looked for in <src>/.hg/patches by default. Use
1753 Source patch repository is looked for in <src>/.hg/patches by 1751 -p <url> to change.
1754 default. Use -p <url> to change. 1752
1755 1753 The patch directory must be a nested Mercurial repository, as would be
1756 The patch directory must be a nested Mercurial repository, as 1754 created by qinit -c.
1757 would be created by qinit -c.
1758 ''' 1755 '''
1759 def patchdir(repo): 1756 def patchdir(repo):
1760 url = repo.url() 1757 url = repo.url()
1761 if url.endswith('/'): 1758 if url.endswith('/'):
1762 url = url[:-1] 1759 url = url[:-1]
1858 do('date', "%d %d" % util.makedate()) 1855 do('date', "%d %d" % util.makedate())
1859 1856
1860 def new(ui, repo, patch, *args, **opts): 1857 def new(ui, repo, patch, *args, **opts):
1861 """create a new patch 1858 """create a new patch
1862 1859
1863 qnew creates a new patch on top of the currently-applied patch (if 1860 qnew creates a new patch on top of the currently-applied patch (if any).
1864 any). It will refuse to run if there are any outstanding changes 1861 It will refuse to run if there are any outstanding changes unless
1865 unless -f/--force is specified, in which case the patch will be 1862 -f/--force is specified, in which case the patch will be initialized with
1866 initialized with them. You may also use -I/--include, 1863 them. You may also use -I/--include, -X/--exclude, and/or a list of files
1867 -X/--exclude, and/or a list of files after the patch name to add 1864 after the patch name to add only changes to matching files to the new
1868 only changes to matching files to the new patch, leaving the rest 1865 patch, leaving the rest as uncommitted modifications.
1869 as uncommitted modifications. 1866
1870 1867 -u/--user and -d/--date can be used to set the (given) user and date,
1871 -u/--user and -d/--date can be used to set the (given) user and 1868 respectively. -U/--currentuser and -D/--currentdate set user to current
1872 date, respectively. -U/--currentuser and -D/--currentdate set user 1869 user and date to current date.
1873 to current user and date to current date. 1870
1874 1871 -e/--edit, -m/--message or -l/--logfile set the patch header as well as
1875 -e/--edit, -m/--message or -l/--logfile set the patch header as 1872 the commit message. If none is specified, the header is empty and the
1876 well as the commit message. If none is specified, the header is 1873 commit message is '[mq]: PATCH'.
1877 empty and the commit message is '[mq]: PATCH'. 1874
1878 1875 Use the -g/--git option to keep the patch in the git extended diff format.
1879 Use the -g/--git option to keep the patch in the git extended diff 1876 Read the diffs help topic for more information on why this is important
1880 format. Read the diffs help topic for more information on why this 1877 for preserving permission changes and copy/rename information.
1881 is important for preserving permission changes and copy/rename
1882 information.
1883 """ 1878 """
1884 msg = cmdutil.logmessage(opts) 1879 msg = cmdutil.logmessage(opts)
1885 def getmsg(): return ui.edit(msg, ui.username()) 1880 def getmsg(): return ui.edit(msg, ui.username())
1886 q = repo.mq 1881 q = repo.mq
1887 opts['msg'] = msg 1882 opts['msg'] = msg
1895 return 0 1890 return 0
1896 1891
1897 def refresh(ui, repo, *pats, **opts): 1892 def refresh(ui, repo, *pats, **opts):
1898 """update the current patch 1893 """update the current patch
1899 1894
1900 If any file patterns are provided, the refreshed patch will 1895 If any file patterns are provided, the refreshed patch will contain only
1901 contain only the modifications that match those patterns; the 1896 the modifications that match those patterns; the remaining modifications
1902 remaining modifications will remain in the working directory. 1897 will remain in the working directory.
1903 1898
1904 If -s/--short is specified, files currently included in the patch 1899 If -s/--short is specified, files currently included in the patch will be
1905 will be refreshed just like matched files and remain in the patch. 1900 refreshed just like matched files and remain in the patch.
1906 1901
1907 hg add/remove/copy/rename work as usual, though you might want to 1902 hg add/remove/copy/rename work as usual, though you might want to use
1908 use git-style patches (-g/--git or [diff] git=1) to track copies 1903 git-style patches (-g/--git or [diff] git=1) to track copies and renames.
1909 and renames. See the diffs help topic for more information on the 1904 See the diffs help topic for more information on the git diff format.
1910 git diff format.
1911 """ 1905 """
1912 q = repo.mq 1906 q = repo.mq
1913 message = cmdutil.logmessage(opts) 1907 message = cmdutil.logmessage(opts)
1914 if opts['edit']: 1908 if opts['edit']:
1915 if not q.applied: 1909 if not q.applied:
1926 return ret 1920 return ret
1927 1921
1928 def diff(ui, repo, *pats, **opts): 1922 def diff(ui, repo, *pats, **opts):
1929 """diff of the current patch and subsequent modifications 1923 """diff of the current patch and subsequent modifications
1930 1924
1931 Shows a diff which includes the current patch as well as any 1925 Shows a diff which includes the current patch as well as any changes which
1932 changes which have been made in the working directory since the 1926 have been made in the working directory since the last refresh (thus
1933 last refresh (thus showing what the current patch would become 1927 showing what the current patch would become after a qrefresh).
1934 after a qrefresh). 1928
1935 1929 Use 'hg diff' if you only want to see the changes made since the last
1936 Use 'hg diff' if you only want to see the changes made since the 1930 qrefresh, or 'hg export qtip' if you want to see changes made by the
1937 last qrefresh, or 'hg export qtip' if you want to see changes made 1931 current patch without including changes made since the qrefresh.
1938 by the current patch without including changes made since the
1939 qrefresh.
1940 """ 1932 """
1941 repo.mq.diff(repo, pats, opts) 1933 repo.mq.diff(repo, pats, opts)
1942 return 0 1934 return 0
1943 1935
1944 def fold(ui, repo, *files, **opts): 1936 def fold(ui, repo, *files, **opts):
1945 """fold the named patches into the current patch 1937 """fold the named patches into the current patch
1946 1938
1947 Patches must not yet be applied. Each patch will be successively 1939 Patches must not yet be applied. Each patch will be successively applied
1948 applied to the current patch in the order given. If all the 1940 to the current patch in the order given. If all the patches apply
1949 patches apply successfully, the current patch will be refreshed 1941 successfully, the current patch will be refreshed with the new cumulative
1950 with the new cumulative patch, and the folded patches will be 1942 patch, and the folded patches will be deleted. With -k/--keep, the folded
1951 deleted. With -k/--keep, the folded patch files will not be 1943 patch files will not be removed afterwards.
1952 removed afterwards. 1944
1953 1945 The header for each folded patch will be concatenated with the current
1954 The header for each folded patch will be concatenated with the 1946 patch header, separated by a line of '* * *'.
1955 current patch header, separated by a line of '* * *'.""" 1947 """
1956 1948
1957 q = repo.mq 1949 q = repo.mq
1958 1950
1959 if not files: 1951 if not files:
1960 raise util.Abort(_('qfold requires at least one patch name')) 1952 raise util.Abort(_('qfold requires at least one patch name'))
2016 return ret 2008 return ret
2017 2009
2018 def guard(ui, repo, *args, **opts): 2010 def guard(ui, repo, *args, **opts):
2019 '''set or print guards for a patch 2011 '''set or print guards for a patch
2020 2012
2021 Guards control whether a patch can be pushed. A patch with no 2013 Guards control whether a patch can be pushed. A patch with no guards is
2022 guards is always pushed. A patch with a positive guard ("+foo") is 2014 always pushed. A patch with a positive guard ("+foo") is pushed only if
2023 pushed only if the qselect command has activated it. A patch with 2015 the qselect command has activated it. A patch with a negative guard
2024 a negative guard ("-foo") is never pushed if the qselect command 2016 ("-foo") is never pushed if the qselect command has activated it.
2025 has activated it. 2017
2026 2018 With no arguments, print the currently active guards. With arguments, set
2027 With no arguments, print the currently active guards. 2019 guards for the named patch.
2028 With arguments, set guards for the named patch.
2029 NOTE: Specifying negative guards now requires '--'. 2020 NOTE: Specifying negative guards now requires '--'.
2030 2021
2031 To set guards on another patch: 2022 To set guards on another patch:
2032 hg qguard -- other.patch +2.6.17 -stable 2023 hg qguard -- other.patch +2.6.17 -stable
2033 ''' 2024 '''
2100 return newpath 2091 return newpath
2101 2092
2102 def push(ui, repo, patch=None, **opts): 2093 def push(ui, repo, patch=None, **opts):
2103 """push the next patch onto the stack 2094 """push the next patch onto the stack
2104 2095
2105 When -f/--force is applied, all local changes in patched files 2096 When -f/--force is applied, all local changes in patched files will be
2106 will be lost. 2097 lost.
2107 """ 2098 """
2108 q = repo.mq 2099 q = repo.mq
2109 mergeq = None 2100 mergeq = None
2110 2101
2111 if opts['merge']: 2102 if opts['merge']:
2123 return ret 2114 return ret
2124 2115
2125 def pop(ui, repo, patch=None, **opts): 2116 def pop(ui, repo, patch=None, **opts):
2126 """pop the current patch off the stack 2117 """pop the current patch off the stack
2127 2118
2128 By default, pops off the top of the patch stack. If given a patch 2119 By default, pops off the top of the patch stack. If given a patch name,
2129 name, keeps popping off patches until the named patch is at the 2120 keeps popping off patches until the named patch is at the top of the
2130 top of the stack. 2121 stack.
2131 """ 2122 """
2132 localupdate = True 2123 localupdate = True
2133 if opts['name']: 2124 if opts['name']:
2134 q = queue(ui, repo.join(""), repo.join(opts['name'])) 2125 q = queue(ui, repo.join(""), repo.join(opts['name']))
2135 ui.warn(_('using patch queue: %s\n') % q.path) 2126 ui.warn(_('using patch queue: %s\n') % q.path)
2242 2233
2243 def strip(ui, repo, rev, **opts): 2234 def strip(ui, repo, rev, **opts):
2244 """strip a revision and all its descendants from the repository 2235 """strip a revision and all its descendants from the repository
2245 2236
2246 If one of the working directory's parent revisions is stripped, the 2237 If one of the working directory's parent revisions is stripped, the
2247 working directory will be updated to the parent of the stripped 2238 working directory will be updated to the parent of the stripped revision.
2248 revision.
2249 """ 2239 """
2250 backup = 'all' 2240 backup = 'all'
2251 if opts['backup']: 2241 if opts['backup']:
2252 backup = 'strip' 2242 backup = 'strip'
2253 elif opts['nobackup']: 2243 elif opts['nobackup']:
2268 return 0 2258 return 0
2269 2259
2270 def select(ui, repo, *args, **opts): 2260 def select(ui, repo, *args, **opts):
2271 '''set or print guarded patches to push 2261 '''set or print guarded patches to push
2272 2262
2273 Use the qguard command to set or print guards on patch, then use 2263 Use the qguard command to set or print guards on patch, then use qselect
2274 qselect to tell mq which guards to use. A patch will be pushed if 2264 to tell mq which guards to use. A patch will be pushed if it has no guards
2275 it has no guards or any positive guards match the currently 2265 or any positive guards match the currently selected guard, but will not be
2276 selected guard, but will not be pushed if any negative guards 2266 pushed if any negative guards match the current guard. For example:
2277 match the current guard. For example:
2278 2267
2279 qguard foo.patch -stable (negative guard) 2268 qguard foo.patch -stable (negative guard)
2280 qguard bar.patch +stable (positive guard) 2269 qguard bar.patch +stable (positive guard)
2281 qselect stable 2270 qselect stable
2282 2271
2283 This activates the "stable" guard. mq will skip foo.patch (because 2272 This activates the "stable" guard. mq will skip foo.patch (because it has
2284 it has a negative match) but push bar.patch (because it has a 2273 a negative match) but push bar.patch (because it has a positive match).
2285 positive match). 2274
2286 2275 With no arguments, prints the currently active guards. With one argument,
2287 With no arguments, prints the currently active guards. 2276 sets the active guard.
2288 With one argument, sets the active guard. 2277
2289 2278 Use -n/--none to deactivate guards (no other arguments needed). When no
2290 Use -n/--none to deactivate guards (no other arguments needed). 2279 guards are active, patches with positive guards are skipped and patches
2291 When no guards are active, patches with positive guards are 2280 with negative guards are pushed.
2292 skipped and patches with negative guards are pushed. 2281
2293 2282 qselect can change the guards on applied patches. It does not pop guarded
2294 qselect can change the guards on applied patches. It does not pop 2283 patches by default. Use --pop to pop back to the last applied patch that
2295 guarded patches by default. Use --pop to pop back to the last 2284 is not guarded. Use --reapply (which implies --pop) to push back to the
2296 applied patch that is not guarded. Use --reapply (which implies 2285 current patch afterwards, but skip guarded patches.
2297 --pop) to push back to the current patch afterwards, but skip 2286
2298 guarded patches. 2287 Use -s/--series to print a list of all guards in the series file (no other
2299 2288 arguments needed). Use -v for more information.
2300 Use -s/--series to print a list of all guards in the series file 2289 '''
2301 (no other arguments needed). Use -v for more information.'''
2302 2290
2303 q = repo.mq 2291 q = repo.mq
2304 guards = q.active() 2292 guards = q.active()
2305 if args or opts['none']: 2293 if args or opts['none']:
2306 old_unapplied = q.unapplied(repo) 2294 old_unapplied = q.unapplied(repo)
2371 q.save_dirty() 2359 q.save_dirty()
2372 2360
2373 def finish(ui, repo, *revrange, **opts): 2361 def finish(ui, repo, *revrange, **opts):
2374 """move applied patches into repository history 2362 """move applied patches into repository history
2375 2363
2376 Finishes the specified revisions (corresponding to applied 2364 Finishes the specified revisions (corresponding to applied patches) by
2377 patches) by moving them out of mq control into regular repository 2365 moving them out of mq control into regular repository history.
2378 history. 2366
2379 2367 Accepts a revision range or the -a/--applied option. If --applied is
2380 Accepts a revision range or the -a/--applied option. If --applied 2368 specified, all applied mq revisions are removed from mq control.
2381 is specified, all applied mq revisions are removed from mq 2369 Otherwise, the given revisions must be at the base of the stack of applied
2382 control. Otherwise, the given revisions must be at the base of the 2370 patches.
2383 stack of applied patches. 2371
2384 2372 This can be especially useful if your changes have been applied to an
2385 This can be especially useful if your changes have been applied to 2373 upstream repository, or if you are about to push your changes to upstream.
2386 an upstream repository, or if you are about to push your changes
2387 to upstream.
2388 """ 2374 """
2389 if not opts['applied'] and not revrange: 2375 if not opts['applied'] and not revrange:
2390 raise util.Abort(_('no revisions specified')) 2376 raise util.Abort(_('no revisions specified'))
2391 elif opts['applied']: 2377 elif opts['applied']:
2392 revrange = ('qbase:qtip',) + revrange 2378 revrange = ('qbase:qtip',) + revrange