templates/map
author Stephen Darnell
Wed, 14 Sep 2005 12:22:20 -0500
changeset 1241 3b4f05ff3130
parent 1132 92525920ad29
child 1336 8c094fb47b59
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:
858
c333dfa8fa1a [PATCH] Move default page name into map file
Jeff Sipek <jeffpc@optonline.net>
parents: 740
diff changeset
     1
default = "changelog"
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
     2
header = header.tmpl
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
     3
footer = footer.tmpl
538
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 380
diff changeset
     4
search = search.tmpl
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents:
diff changeset
     5
changelog = changelog.tmpl
173
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
     6
naventry = "<a href="?cmd=changelog;rev=#rev#">#label#</a> "
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents:
diff changeset
     7
filedifflink = "<a href="?cmd=filediff;node=#node#;file=#file#">#file#</a> "
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents:
diff changeset
     8
filenodelink = "<a href="?cmd=file;filenode=#filenode#;file=#file#">#file#</a> "
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents:
diff changeset
     9
fileellipses = "..."
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents:
diff changeset
    10
changelogentry = changelogentry.tmpl
708
e849b4db6c95 Use changelogentry.tmpl for search results, too.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 672
diff changeset
    11
searchentry = changelogentry.tmpl
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents:
diff changeset
    12
changeset = changeset.tmpl
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents:
diff changeset
    13
manifest = manifest.tmpl
359
0c4688e9ee5c hgweb: add file permissions
mpm@selenic.com
parents: 241
diff changeset
    14
manifestdirentry = "<tr class="parity#parity#"><td><tt>drwxr-xr-x</tt>&nbsp;<td><a href="?cmd=manifest;manifest=#manifest#;path=#path#">#basename#/</a>"
0c4688e9ee5c hgweb: add file permissions
mpm@selenic.com
parents: 241
diff changeset
    15
manifestfileentry = "<tr class="parity#parity#"><td><tt>#permissions|permissions#</tt>&nbsp;<td><a href="?cmd=file;filenode=#filenode#;file=#file#">#basename#</a>"
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents:
diff changeset
    16
filerevision = filerevision.tmpl
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents:
diff changeset
    17
fileannotate = fileannotate.tmpl
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents:
diff changeset
    18
filediff = filediff.tmpl
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents:
diff changeset
    19
filelog = filelog.tmpl
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 173
diff changeset
    20
fileline = "<div class="parity#parity#"><span class="lineno">#linenumber# </span>#line|escape#</div>"
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents:
diff changeset
    21
filelogentry = filelogentry.tmpl
235
eb341488aa4c Obfuscate author in all HTML templates.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 201
diff changeset
    22
annotateline = "<tr class="parity#parity#"><td class="annotate"><a href="?cmd=changeset;node=#node#">#author|obfuscate#@#rev#</a></td><td><pre>#line|escape#</pre></td></tr>"
672
dbe0ce2ae196 More IE friendly diff output related templates.
Edouard Gomez <ed.gomez@free.fr>
parents: 602
diff changeset
    23
difflineplus = "<span class="plusline">#line|escape#</span>"
dbe0ce2ae196 More IE friendly diff output related templates.
Edouard Gomez <ed.gomez@free.fr>
parents: 602
diff changeset
    24
difflineminus = "<span class="minusline">#line|escape#</span>"
dbe0ce2ae196 More IE friendly diff output related templates.
Edouard Gomez <ed.gomez@free.fr>
parents: 602
diff changeset
    25
difflineat = "<span class="atline">#line|escape#</span>"
dbe0ce2ae196 More IE friendly diff output related templates.
Edouard Gomez <ed.gomez@free.fr>
parents: 602
diff changeset
    26
diffline = "#line|escape#"
602
56d81b303656 Various HTML cleanups
mpm@selenic.com
parents: 598
diff changeset
    27
changelogparent = "<tr><th class="parent">parent #rev#:</th><td class="parent"><a href="?cmd=changeset;node=#node#">#node|short#</a></td></tr>"
56d81b303656 Various HTML cleanups
mpm@selenic.com
parents: 598
diff changeset
    28
changesetparent = "<tr><th class="parent">parent #rev#:</th><td class="parent"><a href="?cmd=changeset;node=#node#">#node|short#</a></td></tr>"
375
b29219389b00 Show nice short hashes in hgweb
mpm@selenic.com
parents: 359
diff changeset
    29
filerevparent = "<tr><td class="metatag">parent:</td><td><a href="?cmd=file;file=#file#;filenode=#node#">#node|short#</a></td></tr>"
b29219389b00 Show nice short hashes in hgweb
mpm@selenic.com
parents: 359
diff changeset
    30
fileannotateparent = "<tr><td class="metatag">parent:</td><td><a href="?cmd=annotate;file=#file#;filenode=#node#">#node|short#</a></td></tr>"
168
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 167
diff changeset
    31
tags = tags.tmpl
586
11578820b5d7 [PATCH] Tags template cleanup
mpm@selenic.com
parents: 585
diff changeset
    32
tagentry = "<li class="tagEntry parity#parity#"><span class="node">#node#</span> <a href="?cmd=changeset;node=#node#">#tag#</a></li>"
672
dbe0ce2ae196 More IE friendly diff output related templates.
Edouard Gomez <ed.gomez@free.fr>
parents: 602
diff changeset
    33
diffblock = "<pre class="parity#parity#">#lines#</pre>"
602
56d81b303656 Various HTML cleanups
mpm@selenic.com
parents: 598
diff changeset
    34
changelogtag = "<tr><th class="tag">tag:</th><td class="tag">#tag#</td></tr>"
56d81b303656 Various HTML cleanups
mpm@selenic.com
parents: 598
diff changeset
    35
changesettag = "<tr><th class="tag">tag:</th><td class="tag">#tag#</td></tr>"
56d81b303656 Various HTML cleanups
mpm@selenic.com
parents: 598
diff changeset
    36
filediffparent = "<tr><th class="parent">parent #rev#:</th><td class="parent"><a href="?cmd=changeset;node=#node#">#node|short#</a></td></tr>"
598
f8d44a2e6928 [PATCH 4/5]: cleaning the template parent management in hgweb
mpm@selenic.com
parents: 586
diff changeset
    37
filelogparent = "<tr><td align="right">parent #rev#:&nbsp;</td><td><a href="?cmd=file;file=#file#;filenode=#node#">#node|short#</a></td></tr>"
1132
92525920ad29 Completed renaming author to contact in hgwebdir:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1125
diff changeset
    38
indexentry = "<tr class="parity#parity#"><td><a href="#url#">#name#</a></td><td>#shortdesc#</td><td>#contact|obfuscate#</td><td>#lastupdate|age# ago</td><td><a href="#url#?cmd=changelog;style=rss">RSS</a></td></tr>"
941
4cf418c2a013 Add a multi-repository server
mpm@selenic.com
parents: 896
diff changeset
    39
index = index.tmpl
1123
457c23af92bd Use a template for the error message.
Ollivier Robert <roberto@keltia.freenix.fr>
parents: 1077
diff changeset
    40
archiveentry = "<a href="?cmd=archive;node=#node#;type=#type#">#type#</a> "
457c23af92bd Use a template for the error message.
Ollivier Robert <roberto@keltia.freenix.fr>
parents: 1077
diff changeset
    41
notfound = notfound.tmpl