hgext/purge.py
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Mon, 07 Jul 2014 18:45:46 +0900
changeset 21882 12019e6aa8a2
parent 21853 8127b9e798b1
child 21983 52d34d5415c9
permissions -rw-r--r--
largefiles: show also how many data entities are outgoing at "hg summary" Before this patch, "hg summary --large" shows how many largefiles are changed or added in outgoing revisions only in the point of the view of filenames. For example, according to the number of outgoing largefiles shown in "hg summary" output, users should expect that the former below costs much more to upload outgoing largefiles than the latter. - outgoing revisions add a hundred largefiles, but all of them refer the same data entity in this case, only one data entity is outgoing, even though "hg summary" says that a hundred largefiles are outgoing. - a hundred outgoing revisions change only one largefile with distinct data in this case, a hundred data entities are outgoing, even though "hg summary" says that only one largefile is outgoing. But the latter costs much more than the former, in fact. This patch shows also how many data entities are outgoing at "hg summary" by counting number of unique hash values for outgoing largefiles. This patch introduces "_getoutgoings" to centralize the logic (de-duplication, too) into it for convenience of subsequent patches, even though it is not required in "hg summary" case.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2364
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
     1
# Copyright (C) 2006 - Marco Barisione <marco@barisione.org>
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
     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
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
     4
# that removes files not known to mercurial
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
     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
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
    12
# This program is free software; you can redistribute it and/or modify
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
    13
# it under the terms of the GNU General Public License as published by
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
    14
# the Free Software Foundation; either version 2 of the License, or
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
    15
# (at your option) any later version.
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
    16
#
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
    17
# This program is distributed in the hope that it will be useful,
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
    18
# but WITHOUT ANY WARRANTY; without even the implied warranty of
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
    19
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
    20
# GNU General Public License for more details.
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
    21
#
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
    22
# You should have received a copy of the GNU General Public License
15782
7de7630053cb Remove FSF mailing address from GPL headers
Martin Geisler <mg@aragost.com>
parents: 14671
diff changeset
    23
# along with this program; if not, see <http://www.gnu.org/licenses/>.
2364
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
    24
8934
9dda4c73fc3b extensions: change descriptions for extensions providing a few commands
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8894
diff changeset
    25
'''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
    26
14322
a90131b85fd8 scmutil: drop aliases in cmdutil for match functions
Matt Mackall <mpm@selenic.com>
parents: 14310
diff changeset
    27
from mercurial import util, commands, cmdutil, scmutil
4121
d250076824e3 Use the mercurial i18n infrastructure in the purge extension
Emanuele Aina <em@nerd.ocracy.org>
parents: 4120
diff changeset
    28
from mercurial.i18n import _
8043
b777dd8f7836 purge: remove read-only files under Windows (issue583)
Patrick Mezard <pmezard@gmail.com>
parents: 7998
diff changeset
    29
import os, stat
2364
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
    30
14310
c16ec14d44b6 purge: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 10973
diff changeset
    31
cmdtable = {}
c16ec14d44b6 purge: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 10973
diff changeset
    32
command = cmdutil.command(cmdtable)
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 15782
diff changeset
    33
testedwith = 'internal'
14310
c16ec14d44b6 purge: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 10973
diff changeset
    34
c16ec14d44b6 purge: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 10973
diff changeset
    35
@command('purge|clean',
c16ec14d44b6 purge: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 10973
diff changeset
    36
    [('a', 'abort-on-err', None, _('abort if an error occurs')),
c16ec14d44b6 purge: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 10973
diff changeset
    37
    ('',  'all', None, _('purge ignored files too')),
21853
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
    38
    ('',  'dirs', None, _('purge empty directories')),
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
    39
    ('',  'files', None, _('purge files')),
14310
c16ec14d44b6 purge: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 10973
diff changeset
    40
    ('p', 'print', None, _('print filenames instead of deleting them')),
c16ec14d44b6 purge: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 10973
diff changeset
    41
    ('0', 'print0', None, _('end filenames with NUL, for use with xargs'
c16ec14d44b6 purge: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 10973
diff changeset
    42
                            ' (implies -p/--print)')),
c16ec14d44b6 purge: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 10973
diff changeset
    43
    ] + commands.walkopts,
c16ec14d44b6 purge: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 10973
diff changeset
    44
    _('hg purge [OPTION]... [DIR]...'))
6573
44cd348e6529 purge: eliminate dopurge
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
    45
def purge(ui, repo, *dirs, **opts):
7605
3e592067515d 1 file changed, 7 insertions(+), 9 deletions(-)
Benjamin Pollack <benjamin@bitquabit.com>
parents: 7570
diff changeset
    46
    '''removes files not tracked by Mercurial
6573
44cd348e6529 purge: eliminate dopurge
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
    47
9270
00cc7fa0c0c6 purge: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9215
diff changeset
    48
    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
    49
    and uncommitted changes in an otherwise-clean source tree.
6573
44cd348e6529 purge: eliminate dopurge
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
    50
21853
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
    51
    This means that purge will delete the following by default:
9215
f6a880fa9cd7 purge: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents: 9072
diff changeset
    52
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 9270
diff changeset
    53
    - 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
    54
    - Empty directories: in fact Mercurial ignores directories unless
00cc7fa0c0c6 purge: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9215
diff changeset
    55
      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
    56
6573
44cd348e6529 purge: eliminate dopurge
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
    57
    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
    58
f6a880fa9cd7 purge: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents: 9072
diff changeset
    59
    - Modified and unmodified tracked files
f6a880fa9cd7 purge: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents: 9072
diff changeset
    60
    - Ignored files (unless --all is specified)
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 9270
diff changeset
    61
    - New files added to the repository (with :hg:`add`)
6573
44cd348e6529 purge: eliminate dopurge
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
    62
21853
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
    63
    The --files and --dirs options can be used to direct purge to delete
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
    64
    only files, only directories, or both. If neither option is given,
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
    65
    both will be deleted.
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
    66
6573
44cd348e6529 purge: eliminate dopurge
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
    67
    If directories are given on the command line, only files in these
44cd348e6529 purge: eliminate dopurge
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
    68
    directories are considered.
44cd348e6529 purge: eliminate dopurge
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
    69
9270
00cc7fa0c0c6 purge: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9215
diff changeset
    70
    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
    71
    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
    72
    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
    73
    option.
6573
44cd348e6529 purge: eliminate dopurge
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
    74
    '''
44cd348e6529 purge: eliminate dopurge
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
    75
    act = not opts['print']
6757
55c71226eceb purge: cleanup
Matt Mackall <mpm@selenic.com>
parents: 6754
diff changeset
    76
    eol = '\n'
55c71226eceb purge: cleanup
Matt Mackall <mpm@selenic.com>
parents: 6754
diff changeset
    77
    if opts['print0']:
55c71226eceb purge: cleanup
Matt Mackall <mpm@selenic.com>
parents: 6754
diff changeset
    78
        eol = '\0'
55c71226eceb purge: cleanup
Matt Mackall <mpm@selenic.com>
parents: 6754
diff changeset
    79
        act = False # --print0 implies --print
21853
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
    80
    removefiles = opts['files']
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
    81
    removedirs = opts['dirs']
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
    82
    if not removefiles and not removedirs:
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
    83
        removefiles = True
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
    84
        removedirs = True
2364
f368a1c302d5 Initial commit
demian@gaudron.lan
parents:
diff changeset
    85
4153
af72395580e8 Delete the Purge class, refactoring Purge.purge() in dopurge()
Emanuele Aina <faina.mail@tiscali.it>
parents: 4152
diff changeset
    86
    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
    87
        if act:
af72395580e8 Delete the Purge class, refactoring Purge.purge() in dopurge()
Emanuele Aina <faina.mail@tiscali.it>
parents: 4152
diff changeset
    88
            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
    89
                remove_func(repo.wjoin(name))
7280
810ca383da9c remove unused variables
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6762
diff changeset
    90
            except OSError:
6757
55c71226eceb purge: cleanup
Matt Mackall <mpm@selenic.com>
parents: 6754
diff changeset
    91
                m = _('%s cannot be removed') % name
55c71226eceb purge: cleanup
Matt Mackall <mpm@selenic.com>
parents: 6754
diff changeset
    92
                if opts['abort_on_err']:
55c71226eceb purge: cleanup
Matt Mackall <mpm@selenic.com>
parents: 6754
diff changeset
    93
                    raise util.Abort(m)
55c71226eceb purge: cleanup
Matt Mackall <mpm@selenic.com>
parents: 6754
diff changeset
    94
                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
    95
        else:
af72395580e8 Delete the Purge class, refactoring Purge.purge() in dopurge()
Emanuele Aina <faina.mail@tiscali.it>
parents: 4152
diff changeset
    96
            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
    97
8043
b777dd8f7836 purge: remove read-only files under Windows (issue583)
Patrick Mezard <pmezard@gmail.com>
parents: 7998
diff changeset
    98
    def removefile(path):
8044
c1e2b7407dc3 purge: fix b777dd8f7836 (remove read-only files)
Patrick Mezard <pmezard@gmail.com>
parents: 8043
diff changeset
    99
        try:
c1e2b7407dc3 purge: fix b777dd8f7836 (remove read-only files)
Patrick Mezard <pmezard@gmail.com>
parents: 8043
diff changeset
   100
            os.remove(path)
c1e2b7407dc3 purge: fix b777dd8f7836 (remove read-only files)
Patrick Mezard <pmezard@gmail.com>
parents: 8043
diff changeset
   101
        except OSError:
c1e2b7407dc3 purge: fix b777dd8f7836 (remove read-only files)
Patrick Mezard <pmezard@gmail.com>
parents: 8043
diff changeset
   102
            # 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
   103
            s = os.stat(path)
c1e2b7407dc3 purge: fix b777dd8f7836 (remove read-only files)
Patrick Mezard <pmezard@gmail.com>
parents: 8043
diff changeset
   104
            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
   105
                raise
c1e2b7407dc3 purge: fix b777dd8f7836 (remove read-only files)
Patrick Mezard <pmezard@gmail.com>
parents: 8043
diff changeset
   106
            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
   107
            os.remove(path)
8043
b777dd8f7836 purge: remove read-only files under Windows (issue583)
Patrick Mezard <pmezard@gmail.com>
parents: 7998
diff changeset
   108
4153
af72395580e8 Delete the Purge class, refactoring Purge.purge() in dopurge()
Emanuele Aina <faina.mail@tiscali.it>
parents: 4152
diff changeset
   109
    directories = []
14671
35c2cc322ba8 scmutil: switch match users to supplying contexts
Matt Mackall <mpm@selenic.com>
parents: 14322
diff changeset
   110
    match = scmutil.match(repo[None], dirs, opts)
19139
31c863bd21e8 purge: hook into match.explicitdir and traversedir
Siddharth Agarwal <sid0@fb.com>
parents: 16930
diff changeset
   111
    match.explicitdir = match.traversedir = directories.append
6754
0b700faaef32 purge: use status
Matt Mackall <mpm@selenic.com>
parents: 6746
diff changeset
   112
    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
   113
21853
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
   114
    if removefiles:
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
   115
        for f in sorted(status[4] + status[5]):
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
   116
            if act:
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
   117
                ui.note(_('removing file %s\n') % f)
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
   118
            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
   119
21853
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
   120
    if removedirs:
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
   121
        for f in sorted(directories, reverse=True):
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
   122
            if match(f) and not os.listdir(repo.wjoin(f)):
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
   123
                if act:
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
   124
                    ui.note(_('removing directory %s\n') % f)
8127b9e798b1 purge: add options for deleting only files or only directories
Ben Kehoe <benk@berkeley.edu>
parents: 20565
diff changeset
   125
                remove(os.rmdir, f)