def _storeMetaDataImpl(self, dir_name, pdir_name, ignoreList, cfgObj): """dir_name is absolute path of directory, pdir_name is relative path of directory""" for fb in sorted(os.listdir(dir_name)): f = os.path.join(dir_name, fb) fr = os.path.join(pdir_name, fb) if any(x for x in ignoreList if fnmatch.fnmatch(f, x)): continue assert VccUtil.isTrival(f) tname = "dir" if (os.path.isdir(f) and not os.path.islink(f)) else "file" if os.path.islink(f): tname = "symlink" elif os.path.isdir(f): tname = "dir" elif os.path.isfile(f): tname = "file" else: assert False mode = oct(os.lstat(f).st_mode & 0777) username = pwd.getpwuid(os.lstat(f).st_uid)[0] grouppname = grp.getgrgid(os.lstat(f).st_gid)[0] cfgObj.add_section(fr) cfgObj.set(fr, "tname", tname) cfgObj.set(fr, "mode", mode) cfgObj.set(fr, "owner", "%s:%s"%(username, grouppname)) #cfgObj.set(fr, "mtime", "") #cfgObj.set(fr, "xattr", "") if os.path.isdir(f) and not os.path.islink(f): self._storeMetaDataImpl(f, fr, ignoreList, cfgObj)
def _applyMetaData(self): """Won't follow symbolic links""" ignoreList = self._internal_ignore_list() metadataFile = os.path.join(self.dirName, ".metadata") cfgObj = ConfigParser.RawConfigParser() cfgObj.read(metadataFile) for fr in cfgObj.sections(): f = os.path.join(self.dirName, fr) if any(x for x in ignoreList if fnmatch.fnmatch(f, x)): continue tname = cfgObj.get(fr, "tname") mode = cfgObj.get(fr, "mode") owner = cfgObj.get(fr, "owner") if tname == "symlink": assert VccUtil.isTrival(f) and os.path.islink(f) elif tname == "dir": if not os.path.exists(f): # create directory, but don't modify mtime of parent directory pdir = os.path.dir_name(f) if pdir != self.dirName: tmtime = os.path.getmtime(pdir) os.mkdir(f) if pdir != self.dirName: VccUtil.setFileMtime(pdir, tmtime) else: assert VccUtil.isTrival(f) and os.path.isdir(f) and not os.path.islink(f) elif tname == "file": assert VccUtil.isTrival(f) and os.path.isfile(f) and not os.path.islink(f) else: assert False if not os.path.islink(f): VccUtil.shell("/bin/chmod %s \"%s\""%(mode, f)) VccUtil.shell("/bin/chown -h %s \"%s\""%(owner, f))