Mercurial > hg
annotate hgext/purge.py @ 13155:f02d7a562a21
subrepo: avoids empty commit when .hgsubstate is dirty (issue2403)
This patch avoids empty commit when .hgsubstate is dirty. Empty commit
was caused by .hgsubstate being updated back to the state of the
working copy parent when committing, if a user had changed it manually
and not made any changes in subrepositories.
The subrepository state from the working copies parent is compared
with the state calculated as a result of trying to commit the
subrepositories. If the two states are the same, then return None
otherwise the commit is just done.
The line: "committing subrepository x" will be written if there is
nothing committed, but .hgsubstate is dirty for x subrepository.
author | Erik Zielke <ez@aragost.com> |
---|---|
date | Mon, 29 Nov 2010 09:37:23 +0100 |
parents | 49a07f441496 |
children | c16ec14d44b6 |
rev | line source |
---|---|
2364 | 1 # Copyright (C) 2006 - Marco Barisione <marco@barisione.org> |
2 # | |
8936
1de6e7e1bb9f
change wiki/bts URLs to point to new hostname
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8934
diff
changeset
|
3 # This is a small extension for Mercurial (http://mercurial.selenic.com/) |
2364 | 4 # that removes files not known to mercurial |
5 # | |
9270
00cc7fa0c0c6
purge: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9215
diff
changeset
|
6 # This program was inspired by the "cvspurge" script contained in CVS |
00cc7fa0c0c6
purge: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9215
diff
changeset
|
7 # utilities (http://www.red-bean.com/cvsutils/). |
4154
15cd36db4230
Delete the README for purge, putting the useful informations in comments
Emanuele Aina <em@nerd.ocracy.org>
parents:
4153
diff
changeset
|
8 # |
15cd36db4230
Delete the README for purge, putting the useful informations in comments
Emanuele Aina <em@nerd.ocracy.org>
parents:
4153
diff
changeset
|
9 # For help on the usage of "hg purge" use: |
15cd36db4230
Delete the README for purge, putting the useful informations in comments
Emanuele Aina <em@nerd.ocracy.org>
parents:
4153
diff
changeset
|
10 # hg help purge |
15cd36db4230
Delete the README for purge, putting the useful informations in comments
Emanuele Aina <em@nerd.ocracy.org>
parents:
4153
diff
changeset
|
11 # |
2364 | 12 # This program is free software; you can redistribute it and/or modify |
13 # it under the terms of the GNU General Public License as published by | |
14 # the Free Software Foundation; either version 2 of the License, or | |
15 # (at your option) any later version. | |
16 # | |
17 # This program is distributed in the hope that it will be useful, | |
18 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
20 # GNU General Public License for more details. | |
21 # | |
22 # You should have received a copy of the GNU General Public License | |
23 # along with this program; if not, write to the Free Software | |
24 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
25 | |
8934
9dda4c73fc3b
extensions: change descriptions for extensions providing a few commands
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8894
diff
changeset
|
26 '''command to delete untracked files from the working directory''' |
8873
e872ef2e6758
help: add/fix docstrings for a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8866
diff
changeset
|
27 |
6574
76af1dff402a
purge: use cmdutil.matchpats
Matt Mackall <mpm@selenic.com>
parents:
6573
diff
changeset
|
28 from mercurial import util, commands, cmdutil |
4121
d250076824e3
Use the mercurial i18n infrastructure in the purge extension
Emanuele Aina <em@nerd.ocracy.org>
parents:
4120
diff
changeset
|
29 from mercurial.i18n import _ |
8043
b777dd8f7836
purge: remove read-only files under Windows (issue583)
Patrick Mezard <pmezard@gmail.com>
parents:
7998
diff
changeset
|
30 import os, stat |
2364 | 31 |
6573 | 32 def purge(ui, repo, *dirs, **opts): |
7605
3e592067515d
1 file changed, 7 insertions(+), 9 deletions(-)
Benjamin Pollack <benjamin@bitquabit.com>
parents:
7570
diff
changeset
|
33 '''removes files not tracked by Mercurial |
6573 | 34 |
9270
00cc7fa0c0c6
purge: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9215
diff
changeset
|
35 Delete files not known to Mercurial. This is useful to test local |
00cc7fa0c0c6
purge: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9215
diff
changeset
|
36 and uncommitted changes in an otherwise-clean source tree. |
6573 | 37 |
38 This means that purge will delete: | |
9215
f6a880fa9cd7
purge: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents:
9072
diff
changeset
|
39 |
10973
49a07f441496
Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents:
9270
diff
changeset
|
40 - Unknown files: files marked with "?" by :hg:`status` |
9270
00cc7fa0c0c6
purge: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9215
diff
changeset
|
41 - Empty directories: in fact Mercurial ignores directories unless |
00cc7fa0c0c6
purge: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9215
diff
changeset
|
42 they contain files under source control management |
9215
f6a880fa9cd7
purge: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents:
9072
diff
changeset
|
43 |
6573 | 44 But it will leave untouched: |
9215
f6a880fa9cd7
purge: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents:
9072
diff
changeset
|
45 |
f6a880fa9cd7
purge: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents:
9072
diff
changeset
|
46 - Modified and unmodified tracked files |
f6a880fa9cd7
purge: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents:
9072
diff
changeset
|
47 - Ignored files (unless --all is specified) |
10973
49a07f441496
Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents:
9270
diff
changeset
|
48 - New files added to the repository (with :hg:`add`) |
6573 | 49 |
50 If directories are given on the command line, only files in these | |
51 directories are considered. | |
52 | |
9270
00cc7fa0c0c6
purge: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9215
diff
changeset
|
53 Be careful with purge, as you could irreversibly delete some files |
00cc7fa0c0c6
purge: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9215
diff
changeset
|
54 you forgot to add to the repository. If you only want to print the |
00cc7fa0c0c6
purge: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9215
diff
changeset
|
55 list of files that this program would delete, use the --print |
00cc7fa0c0c6
purge: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9215
diff
changeset
|
56 option. |
6573 | 57 ''' |
58 act = not opts['print'] | |
6757 | 59 eol = '\n' |
60 if opts['print0']: | |
61 eol = '\0' | |
62 act = False # --print0 implies --print | |
2364 | 63 |
4153
af72395580e8
Delete the Purge class, refactoring Purge.purge() in dopurge()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4152
diff
changeset
|
64 def remove(remove_func, name): |
af72395580e8
Delete the Purge class, refactoring Purge.purge() in dopurge()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4152
diff
changeset
|
65 if act: |
af72395580e8
Delete the Purge class, refactoring Purge.purge() in dopurge()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4152
diff
changeset
|
66 try: |
7570
e05aa73ce2b7
use repo.wjoin(f) instead of os.path.join(repo.root, f)
Martin Geisler <mg@daimi.au.dk>
parents:
7280
diff
changeset
|
67 remove_func(repo.wjoin(name)) |
7280
810ca383da9c
remove unused variables
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6762
diff
changeset
|
68 except OSError: |
6757 | 69 m = _('%s cannot be removed') % name |
70 if opts['abort_on_err']: | |
71 raise util.Abort(m) | |
72 ui.warn(_('warning: %s\n') % m) | |
4153
af72395580e8
Delete the Purge class, refactoring Purge.purge() in dopurge()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4152
diff
changeset
|
73 else: |
af72395580e8
Delete the Purge class, refactoring Purge.purge() in dopurge()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4152
diff
changeset
|
74 ui.write('%s%s' % (name, eol)) |
4151
337010e50dcd
Use nested functions instead of object methods
Emanuele Aina <faina.mail@tiscali.it>
parents:
4150
diff
changeset
|
75 |
8043
b777dd8f7836
purge: remove read-only files under Windows (issue583)
Patrick Mezard <pmezard@gmail.com>
parents:
7998
diff
changeset
|
76 def removefile(path): |
8044
c1e2b7407dc3
purge: fix b777dd8f7836 (remove read-only files)
Patrick Mezard <pmezard@gmail.com>
parents:
8043
diff
changeset
|
77 try: |
c1e2b7407dc3
purge: fix b777dd8f7836 (remove read-only files)
Patrick Mezard <pmezard@gmail.com>
parents:
8043
diff
changeset
|
78 os.remove(path) |
c1e2b7407dc3
purge: fix b777dd8f7836 (remove read-only files)
Patrick Mezard <pmezard@gmail.com>
parents:
8043
diff
changeset
|
79 except OSError: |
c1e2b7407dc3
purge: fix b777dd8f7836 (remove read-only files)
Patrick Mezard <pmezard@gmail.com>
parents:
8043
diff
changeset
|
80 # read-only files cannot be unlinked under Windows |
c1e2b7407dc3
purge: fix b777dd8f7836 (remove read-only files)
Patrick Mezard <pmezard@gmail.com>
parents:
8043
diff
changeset
|
81 s = os.stat(path) |
c1e2b7407dc3
purge: fix b777dd8f7836 (remove read-only files)
Patrick Mezard <pmezard@gmail.com>
parents:
8043
diff
changeset
|
82 if (s.st_mode & stat.S_IWRITE) != 0: |
c1e2b7407dc3
purge: fix b777dd8f7836 (remove read-only files)
Patrick Mezard <pmezard@gmail.com>
parents:
8043
diff
changeset
|
83 raise |
c1e2b7407dc3
purge: fix b777dd8f7836 (remove read-only files)
Patrick Mezard <pmezard@gmail.com>
parents:
8043
diff
changeset
|
84 os.chmod(path, stat.S_IMODE(s.st_mode) | stat.S_IWRITE) |
c1e2b7407dc3
purge: fix b777dd8f7836 (remove read-only files)
Patrick Mezard <pmezard@gmail.com>
parents:
8043
diff
changeset
|
85 os.remove(path) |
8043
b777dd8f7836
purge: remove read-only files under Windows (issue583)
Patrick Mezard <pmezard@gmail.com>
parents:
7998
diff
changeset
|
86 |
4153
af72395580e8
Delete the Purge class, refactoring Purge.purge() in dopurge()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4152
diff
changeset
|
87 directories = [] |
6582
5acbdd3941c4
walk: remove remaining users of cmdutils.matchpats
Matt Mackall <mpm@selenic.com>
parents:
6574
diff
changeset
|
88 match = cmdutil.match(repo, dirs, opts) |
6588
10c23c1d5f33
walk: use match.dir in statwalk
Matt Mackall <mpm@selenic.com>
parents:
6582
diff
changeset
|
89 match.dir = directories.append |
6754 | 90 status = repo.status(match=match, ignored=opts['all'], unknown=True) |
4147
691f9168a815
Make the purge extension use the statwalk walker from the dirstate object
Emanuele Aina <faina.mail@tiscali.it>
parents:
4121
diff
changeset
|
91 |
8209
a1a5a57efe90
replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents:
8076
diff
changeset
|
92 for f in sorted(status[4] + status[5]): |
6754 | 93 ui.note(_('Removing file %s\n') % f) |
8043
b777dd8f7836
purge: remove read-only files under Windows (issue583)
Patrick Mezard <pmezard@gmail.com>
parents:
7998
diff
changeset
|
94 remove(removefile, f) |
4147
691f9168a815
Make the purge extension use the statwalk walker from the dirstate object
Emanuele Aina <faina.mail@tiscali.it>
parents:
4121
diff
changeset
|
95 |
8209
a1a5a57efe90
replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents:
8076
diff
changeset
|
96 for f in sorted(directories, reverse=True): |
4463
a73cf208b2a0
purge: add --include and --exclude options
Emanuele Aina <em@nerd.ocracy.org>
parents:
4311
diff
changeset
|
97 if match(f) and not os.listdir(repo.wjoin(f)): |
4153
af72395580e8
Delete the Purge class, refactoring Purge.purge() in dopurge()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4152
diff
changeset
|
98 ui.note(_('Removing directory %s\n') % f) |
af72395580e8
Delete the Purge class, refactoring Purge.purge() in dopurge()
Emanuele Aina <faina.mail@tiscali.it>
parents:
4152
diff
changeset
|
99 remove(os.rmdir, f) |
2364 | 100 |
101 cmdtable = { | |
4695
c3da7b6cc975
purge: add the clean alias inspired by git-clean and svn-clean
Emanuele Aina <em@nerd.ocracy.org>
parents:
4691
diff
changeset
|
102 'purge|clean': |
2382
b429566d1994
Make indentation of purge's cmdtable match to mercurial/commands.py
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2381
diff
changeset
|
103 (purge, |
b429566d1994
Make indentation of purge's cmdtable match to mercurial/commands.py
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2381
diff
changeset
|
104 [('a', 'abort-on-err', None, _('abort if an error occurs')), |
4691
ca4971347e0a
purge: don't delete ignored files if --all is not specified
Emanuele Aina <em@nerd.ocracy.org>
parents:
4516
diff
changeset
|
105 ('', 'all', None, _('purge ignored files too')), |
8761
0289f384e1e5
Generally replace "file name" with "filename" in help and comments.
timeless <timeless@gmail.com>
parents:
8617
diff
changeset
|
106 ('p', 'print', None, _('print filenames instead of deleting them')), |
2382
b429566d1994
Make indentation of purge's cmdtable match to mercurial/commands.py
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2381
diff
changeset
|
107 ('0', 'print0', None, _('end filenames with NUL, for use with xargs' |
8076
5ec526c1a32f
help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents:
8044
diff
changeset
|
108 ' (implies -p/--print)')), |
5147
c80af96943aa
refactor options from cmdtable
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
4957
diff
changeset
|
109 ] + commands.walkopts, |
2382
b429566d1994
Make indentation of purge's cmdtable match to mercurial/commands.py
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2381
diff
changeset
|
110 _('hg purge [OPTION]... [DIR]...')) |
2364 | 111 } |