[svn r37264] create the new development trunk
--HG-- branch : trunk
This commit is contained in:
126
py/path/local/posix.py
Normal file
126
py/path/local/posix.py
Normal file
@@ -0,0 +1,126 @@
|
||||
"""
|
||||
module to access local filesystem pathes
|
||||
(mostly filename manipulations but also file operations)
|
||||
"""
|
||||
import os, sys, stat
|
||||
|
||||
import py
|
||||
#__________________________________________________________
|
||||
#
|
||||
# Local Path Posix Mixin
|
||||
#__________________________________________________________
|
||||
|
||||
from py.__.path.local.common import Stat
|
||||
|
||||
class PosixStat(Stat):
|
||||
def owner(self):
|
||||
entry = self.path._callex(py.std.pwd.getpwuid, self.uid)
|
||||
return entry[0]
|
||||
owner = property(owner, None, None, "owner of path")
|
||||
|
||||
def group(self):
|
||||
""" return group name of file. """
|
||||
entry = self.path._callex(py.std.grp.getgrgid, self.gid)
|
||||
return entry[0]
|
||||
group = property(group)
|
||||
|
||||
class PosixMixin(object):
|
||||
def _makestat(self, statresult):
|
||||
return PosixStat(self, statresult)
|
||||
|
||||
def _deprecated(self, name):
|
||||
py.std.warnings.warn("'path.%s()' is deprecated, use "
|
||||
"'path.stat().%s' instead." % (name,name),
|
||||
DeprecationWarning, stacklevel=3)
|
||||
|
||||
# an instance needs to be a local path instance
|
||||
def owner(self):
|
||||
""" return owner name of file. """
|
||||
self._deprecated('owner')
|
||||
return self.stat().owner
|
||||
|
||||
def group(self):
|
||||
""" return group name of file. """
|
||||
self._deprecated('group')
|
||||
return self.stat().group
|
||||
|
||||
def mode(self):
|
||||
""" return permission mode of the path object """
|
||||
self._deprecated('mode')
|
||||
return self.stat().mode
|
||||
|
||||
def chmod(self, mode, rec=0):
|
||||
""" change permissions to the given mode. If mode is an
|
||||
integer it directly encodes the os-specific modes.
|
||||
if rec is True perform recursively.
|
||||
|
||||
(xxx if mode is a string then it specifies access rights
|
||||
in '/bin/chmod' style, e.g. a+r).
|
||||
"""
|
||||
if not isinstance(mode, int):
|
||||
raise TypeError("mode %r must be an integer" % (mode,))
|
||||
if rec:
|
||||
for x in self.visit(rec=rec):
|
||||
self._callex(os.chmod, str(x), mode)
|
||||
self._callex(os.chmod, str(self), mode)
|
||||
|
||||
def chown(self, user, group, rec=0):
|
||||
""" change ownership to the given user and group.
|
||||
user and group may be specified by a number or
|
||||
by a name. if rec is True change ownership
|
||||
recursively.
|
||||
"""
|
||||
uid = getuserid(user)
|
||||
gid = getgroupid(group)
|
||||
if rec:
|
||||
for x in self.visit(rec=lambda x: x.check(link=0)):
|
||||
if x.check(link=0):
|
||||
self._callex(os.chown, str(x), uid, gid)
|
||||
self._callex(os.chown, str(self), uid, gid)
|
||||
|
||||
def readlink(self):
|
||||
""" return value of a symbolic link. """
|
||||
return self._callex(os.readlink, self.strpath)
|
||||
|
||||
def mklinkto(self, oldname):
|
||||
""" posix style hard link to another name. """
|
||||
self._callex(os.link, str(oldname), str(self))
|
||||
|
||||
def mksymlinkto(self, value, absolute=1):
|
||||
""" create a symbolic link with the given value (pointing to another name). """
|
||||
if absolute:
|
||||
self._callex(os.symlink, str(value), self.strpath)
|
||||
else:
|
||||
base = self.common(value)
|
||||
# with posix local paths '/' is always a common base
|
||||
relsource = self.__class__(value).relto(base)
|
||||
reldest = self.relto(base)
|
||||
n = reldest.count(self.sep)
|
||||
target = self.sep.join(('..', )*n + (relsource, ))
|
||||
self._callex(os.symlink, target, self.strpath)
|
||||
|
||||
|
||||
def remove(self, rec=1):
|
||||
""" remove a file or directory (or a directory tree if rec=1). """
|
||||
if self.check(dir=1, link=0):
|
||||
if rec:
|
||||
self._callex(py.std.shutil.rmtree, self.strpath)
|
||||
else:
|
||||
self._callex(os.rmdir, self.strpath)
|
||||
else:
|
||||
self._callex(os.remove, self.strpath)
|
||||
|
||||
|
||||
def getuserid(user):
|
||||
import pwd
|
||||
if isinstance(user, int):
|
||||
return user
|
||||
entry = pwd.getpwnam(user)
|
||||
return entry[2]
|
||||
|
||||
def getgroupid(group):
|
||||
import grp
|
||||
if isinstance(group, int):
|
||||
return group
|
||||
entry = grp.getgrnam(group)
|
||||
return entry[2]
|
||||
Reference in New Issue
Block a user