Move hg from storing files in data with base64 encoding to full

pathnames with .i and .d extensions. This means we naturally get good
FS layout, and cp and tar fix things up nicely rather than pessimizing
layout.
This commit is contained in:
mpm@selenic.com 2005-05-20 17:27:21 -08:00
parent 836655a3c5
commit c60581071a

View File

@ -5,7 +5,7 @@
# This software may be used and distributed according to the terms # This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference. # of the GNU General Public License, incorporated herein by reference.
import sys, struct, sha, socket, os, time, base64, re, urllib2 import sys, struct, sha, socket, os, time, re, urllib2
import urllib import urllib
from mercurial import byterange from mercurial import byterange
from mercurial.transaction import * from mercurial.transaction import *
@ -14,16 +14,7 @@ from difflib import SequenceMatcher
class filelog(revlog): class filelog(revlog):
def __init__(self, opener, path): def __init__(self, opener, path):
s = self.encodepath(path) revlog.__init__(self, opener, path + ".i", path + ".d")
revlog.__init__(self, opener, os.path.join("data", s + "i"),
os.path.join("data", s))
def encodepath(self, path):
s = sha.sha(path).digest()
s = base64.encodestring(s)[:-3]
s = re.sub("\+", "%", s)
s = re.sub("/", "_", s)
return s
def read(self, node): def read(self, node):
return self.revision(node) return self.revision(node)
@ -210,11 +201,17 @@ def opener(base):
f = os.path.join(p, path) f = os.path.join(p, path)
if mode != "r" and os.path.isfile(f): if mode != "r":
s = os.stat(f) try:
if s.st_nlink > 1: s = os.stat(f)
file(f + ".tmp", "w").write(file(f).read()) except OSError:
os.rename(f+".tmp", f) d = os.path.dirname(f)
if not os.path.isdir(d):
os.makedirs(d)
else:
if s.st_nlink > 1:
file(f + ".tmp", "w").write(file(f).read())
os.rename(f+".tmp", f)
return file(f, mode) return file(f, mode)