contrib/tcsh_completion_build.sh
author Stephen Darnell
Wed, 14 Sep 2005 12:22:20 -0500
changeset 1241 3b4f05ff3130
parent 1157 6e66235084d9
child 1308 2073e5a71008
permissions -rw-r--r--
Add support for cloning with hardlinks on windows. In order to use hardlinks, the win32file module is needed, and this is present in ActivePython. If it isn't present, or hardlinks are not supported on the underlying filesystem, a regular copy is used. When using hardlinks the biggest benefit is probably the saving in space, but cloning can be much quicker. For example cloning the Xen tree (non trivial) without an update goes from about 95s to 15s. Unix-like platforms should be unaffected, although should be more tolerant on filesystems that don't support hard links. (tweaked by mpm to deal with new copyfiles function) --- hg.orig/mercurial/commands.py 2005-09-13 19:32:53.000000000 -0500 +++ hg/mercurial/commands.py 2005-09-14 12:11:34.000000000 -0500 @@ -620,10 +620,6 @@ def clone(ui, source, dest=None, **opts) if other.dev() != -1: abspath = os.path.abspath(source) - copyfile = (os.stat(dest).st_dev == other.dev() - and getattr(os, 'link', None) or shutil.copy2) - if copyfile is not shutil.copy2: - ui.note("cloning by hardlink\n") # we use a lock here because if we race with commit, we can # end up with extra data in the cloned revlogs that's not @@ -638,7 +634,7 @@ def clone(ui, source, dest=None, **opts) for f in files.split(): src = os.path.join(source, ".hg", f) dst = os.path.join(dest, ".hg", f) - util.copyfiles(src, dst, copyfile) + util.copyfiles(src, dst) repo = hg.repository(ui, dest) Index: hg/mercurial/util.py =================================================================== --- hg.orig/mercurial/util.py 2005-09-08 00:15:25.000000000 -0500 +++ hg/mercurial/util.py 2005-09-14 12:16:49.000000000 -0500 @@ -12,7 +12,7 @@ platform-specific details from the core. import os, errno from demandload import * -demandload(globals(), "re cStringIO") +demandload(globals(), "re cStringIO shutil") def binary(s): """return true if a string is binary data using diff's heuristic""" @@ -217,17 +217,28 @@ def rename(src, dst): os.unlink(dst) os.rename(src, dst) -def copyfiles(src, dst, copyfile): - """Copy a directory tree, files are copied using 'copyfile'.""" +def copyfiles(src, dst, hardlink=None): + """Copy a directory tree using hardlinks if possible""" + + if hardlink is None: + hardlink = (os.stat(src).st_dev == + os.stat(os.path.dirname(dst)).st_dev) if os.path.isdir(src): os.mkdir(dst) for name in os.listdir(src): srcname = os.path.join(src, name) dstname = os.path.join(dst, name) - copyfiles(srcname, dstname, copyfile) + copyfiles(srcname, dstname, hardlink) else: - copyfile(src, dst) + if hardlink: + try: + os_link(src, dst) + except: + hardlink = False + shutil.copy2(src, dst) + else: + shutil.copy2(src, dst) def opener(base): """ @@ -244,13 +255,13 @@ def opener(base): if mode[0] != "r": try: - s = os.stat(f) + nlink = nlinks(f) except OSError: d = os.path.dirname(f) if not os.path.isdir(d): os.makedirs(d) else: - if s.st_nlink > 1: + if nlink > 1: file(f + ".tmp", "wb").write(file(f, "rb").read()) rename(f+".tmp", f) @@ -266,10 +277,41 @@ def _makelock_file(info, pathname): def _readlock_file(pathname): return file(pathname).read() +def nlinks(pathname): + """Return number of hardlinks for the given file.""" + return os.stat(pathname).st_nlink + +if hasattr(os, 'link'): + os_link = os.link +else: + def os_link(src, dst): + raise OSError(0, "Hardlinks not supported") + # Platform specific variants if os.name == 'nt': nulldev = 'NUL:' + try: # ActivePython can create hard links using win32file module + import win32file + + def os_link(src, dst): # NB will only succeed on NTFS + win32file.CreateHardLink(dst, src) + + def nlinks(pathname): + """Return number of hardlinks for the given file.""" + try: + fh = win32file.CreateFile(pathname, + win32file.GENERIC_READ, win32file.FILE_SHARE_READ, + None, win32file.OPEN_EXISTING, 0, None) + res = win32file.GetFileInformationByHandle(fh) + fh.Close() + return res[7] + except: + return os.stat(pathname).st_nlink + + except ImportError: + pass + def is_exec(f, last): return last
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1155
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     1
#!/bin/sh
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     2
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     3
#
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     4
# tcsh_completion_build.sh - script to generate tcsh completion
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     5
#
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     6
#
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     7
# Copyright (C) 2005 TK Soh.
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     8
#
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     9
# This is free software; you can redistribute it and/or modify it under
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    10
# the terms of the GNU General Public License as published by the Free
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    11
# Software Foundation; either version 2 of the License, or (at your
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    12
# option) any later version. 
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    13
#
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    14
#
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    15
# Description
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    16
# -----------
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    17
# This script generates a tcsh source file to support completion
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    18
# of Mercurial commands and options.
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    19
#
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    20
# Instruction:
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    21
# -----------
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    22
# Run this script to generate the tcsh source file, and source
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    23
# the file to add command completion support for Mercurial.
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    24
#
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    25
#    tcsh% tcsh_completion.sh FILE
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    26
#    tcsh% source FILE
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    27
#
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    28
# If FILE is not specified, tcsh_completion will be generated.
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    29
#
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    30
# Bugs:
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    31
# ----
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    32
# 1. command specific options are not supported
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    33
# 2. hg commands must be specified immediately after 'hg'.
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    34
#
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    35
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    36
tcsh_file=${1-tcsh_completion}
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    37
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    38
hg_commands=`hg --debug help | \
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    39
        sed -e '1,/^list of commands:/d' \
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    40
            -e '/^global options:/,$d' \
1157
6e66235084d9 tcsh_completion_build.sh: fixed error caused by xargs on Linux
TK Soh <tksoh@freescale.com>
parents: 1155
diff changeset
    41
            -e '/^ [^ ]/!d; s/[,:]//g;' | \
1155
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    42
        xargs -n5 | \
1157
6e66235084d9 tcsh_completion_build.sh: fixed error caused by xargs on Linux
TK Soh <tksoh@freescale.com>
parents: 1155
diff changeset
    43
        sed -e '$!s/$/ \\\\/g; 2,$s/^ */    /g'`
1155
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    44
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    45
hg_global_options=`hg -v help | \
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    46
        sed -e '1,/global/d;/^ *-/!d; s/ [^- ].*//' | \
1157
6e66235084d9 tcsh_completion_build.sh: fixed error caused by xargs on Linux
TK Soh <tksoh@freescale.com>
parents: 1155
diff changeset
    47
        sed -e 's/ *$//; $!s/$/ \\\\/g; 2,$s/^ */    /g'`
1155
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    48
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    49
hg_version=`hg version | sed -e '1q'`
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    50
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    51
script_name=`basename $0`
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    52
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    53
cat > $tcsh_file <<END
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    54
#
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    55
# tcsh completion for Mercurial
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    56
#
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    57
# This file has been auto-generated by $script_name for
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    58
# $hg_version 
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    59
#
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    60
# Copyright (C) 2005 TK Soh.
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    61
#
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    62
# This is free software; you can redistribute it and/or modify it under
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    63
# the terms of the GNU General Public License as published by the Free
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    64
# Software Foundation; either version 2 of the License, or (at your
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    65
# option) any later version. 
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    66
#
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    67
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    68
complete hg \\
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    69
  'n/--cwd/d/' 'n/-R/d/' 'n/--repository/d/' \\
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    70
  'C/-/($hg_global_options)/' \\
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    71
  'p/1/($hg_commands)/'
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    72
92697ad28f08 Add contrib script for generating tcsh completion source
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    73
END