亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? svnperms.py

?? subversion-1.4.5.tar.gz 配置svn的源碼
?? PY
字號:
#!/usr/bin/env python# $HeadURL: http://svn.collab.net/repos/svn/branches/1.4.x/tools/hook-scripts/svnperms.py $# $LastChangedDate: 2005-09-23 18:19:04 +0000 (Fri, 23 Sep 2005) $# $LastChangedBy: niemeyer $# $LastChangedRevision: 16232 $import commandsimport sys, osimport getoptimport re__author__ = "Gustavo Niemeyer <gustavo@niemeyer.net>"class Error(Exception): passSECTION = re.compile(r'\[([^]]+?)(?:\s+extends\s+([^]]+))?\]')OPTION = re.compile(r'(\S+)\s*=\s*(.*)$')class Config:    def __init__(self, filename):        # Options are stored in __sections_list like this:        # [(sectname, [(optname, optval), ...]), ...]        self._sections_list = []        self._sections_dict = {}        self._read(filename)    def _read(self, filename):        # Use the same logic as in ConfigParser.__read()        file = open(filename)        cursectdict = None        optname = None        lineno = 0        for line in file.xreadlines():            lineno = lineno + 1            if line.isspace() or line[0] == '#':                continue            if line[0].isspace() and cursectdict is not None and optname:                value = line.strip()                cursectdict[optname] = "%s %s" % (cursectdict[optname], value)                cursectlist[-1][1] = "%s %s" % (cursectlist[-1][1], value)            else:                m = SECTION.match(line)                if m:                    sectname = m.group(1)                    parentsectname = m.group(2)                    if parentsectname is None:                        # No parent section defined, so start a new section                        cursectdict = self._sections_dict.setdefault \                            (sectname, {})                        cursectlist = []                    else:                        # Copy the parent section into the new section                        parentsectdict = self._sections_dict.get \                            (parentsectname, {})                        cursectdict = self._sections_dict.setdefault \                            (sectname, parentsectdict.copy())                        cursectlist = self.walk(parentsectname)                    self._sections_list.append((sectname, cursectlist))                    optname = None                elif cursectdict is None:                    raise Error, "%s:%d: no section header" % \                                 (filename, lineno)                else:                    m = OPTION.match(line)                    if m:                        optname, optval = m.groups()                        optval = optval.strip()                        cursectdict[optname] = optval                        cursectlist.append([optname, optval])                    else:                        raise Error, "%s:%d: parsing error" % \                                     (filename, lineno)    def sections(self):        return self._sections_dict.keys()    def options(self, section):        return self._sections_dict.get(section, {}).keys()    def get(self, section, option, default=None):        return self._sections_dict.get(option, default)    def walk(self, section, option=None):        ret = []        for sectname, options in self._sections_list:            if sectname == section:                for optname, value in options:                    if not option or optname == option:                        ret.append((optname, value))        return retclass Permission:    def __init__(self):        self._group = {}        self._permlist = []        def parse_groups(self, groupsiter):        for option, value in groupsiter:            self._group[option] = value.split()                def parse_perms(self, permsiter):        for option, value in permsiter:            # Paths never start with /, so remove it if provided            if option[0] == "/":                option = option[1:]            pattern = re.compile("^%s$" % option)            for entry in value.split():                openpar, closepar = entry.find("("), entry.find(")")                groupsusers = entry[:openpar].split(",")                perms = entry[openpar+1:closepar].split(",")                users = []                for groupuser in groupsusers:                    if groupuser[0] == "@":                        try:                            users.extend(self._group[groupuser[1:]])                        except KeyError:                            raise Error, "group '%s' not found" % \                                         groupuser[1:]                    else:                        users.append(groupuser)                self._permlist.append((pattern, users, perms))    def get(self, user, path):        ret = []        for pattern, users, perms in self._permlist:            if pattern.match(path) and (user in users or "*" in users):                ret = perms        return retclass SVNLook:    def __init__(self, repospath, txn=None, rev=None):        self.repospath = repospath        self.txn = txn        self.rev = rev    def _execcmd(self, *cmd, **kwargs):        cmdstr = " ".join(cmd)        status, output = commands.getstatusoutput(cmdstr)        if status != 0:            sys.stderr.write(cmdstr)            sys.stderr.write("\n")            sys.stderr.write(output)            raise Error, "command failed: %s\n%s" % (cmdstr, output)        return status, output    def _execsvnlook(self, cmd, *args, **kwargs):        execcmd_args = ["svnlook", cmd, self.repospath]        self._add_txnrev(execcmd_args, kwargs)        execcmd_args += args        execcmd_kwargs = {}        keywords = ["show", "noerror"]        for key in keywords:            if kwargs.has_key(key):                execcmd_kwargs[key] = kwargs[key]        return self._execcmd(*execcmd_args, **execcmd_kwargs)    def _add_txnrev(self, cmd_args, received_kwargs):        if received_kwargs.has_key("txn"):            txn = received_kwargs.get("txn")            if txn is not None:                cmd_args += ["-t", txn]        elif self.txn is not None:            cmd_args += ["-t", self.txn]        if received_kwargs.has_key("rev"):            rev = received_kwargs.get("rev")            if rev is not None:                cmd_args += ["-r", rev]        elif self.rev is not None:            cmd_args += ["-r", self.rev]    def changed(self, **kwargs):        status, output = self._execsvnlook("changed", **kwargs)        if status != 0:            return None        changes = []        for line in output.splitlines():            line = line.rstrip()            if not line: continue            entry = [None, None, None]            changedata, changeprop, path = None, None, None            if line[0] != "_":                changedata = line[0]            if line[1] != " ":                changeprop = line[1]            path = line[4:]            changes.append((changedata, changeprop, path))        return changes    def author(self, **kwargs):        status, output = self._execsvnlook("author", **kwargs)        if status != 0:            return None        return output.strip()def check_perms(filename, section, repos, txn=None, rev=None, author=None):    svnlook = SVNLook(repos, txn=txn, rev=rev)    if author is None:        author = svnlook.author()    changes = svnlook.changed()    try:        config = Config(filename)    except IOError:        raise Error, "can't read config file "+filename    if not section in config.sections():        raise Error, "section '%s' not found in config file" % section    perm = Permission()    perm.parse_groups(config.walk("groups"))    perm.parse_groups(config.walk(section+" groups"))    perm.parse_perms(config.walk(section))    permerrors = []    for changedata, changeprop, path in changes:        pathperms = perm.get(author, path)        if changedata == "A" and "add" not in pathperms:            permerrors.append("you can't add "+path)        elif changedata == "U" and "update" not in pathperms:            permerrors.append("you can't update "+path)        elif changedata == "D" and "remove" not in pathperms:            permerrors.append("you can't remove "+path)        elif changeprop == "U" and "update" not in pathperms:            permerrors.append("you can't update properties of "+path)        #else:        #    print "cdata=%s cprop=%s path=%s perms=%s" % \        #          (str(changedata), str(changeprop), path, str(pathperms))    if permerrors:        permerrors.insert(0, "you don't have enough permissions for "                             "this transaction:")        raise Error, "\n".join(permerrors)# Command:USAGE = """\Usage: svnperms.py OPTIONSOptions:    -r PATH    Use repository at PATH to check transactions    -t TXN     Query transaction TXN for commit information    -f PATH    Use PATH as configuration file (default is repository               path + /conf/svnperms.conf)    -s NAME    Use section NAME as permission section (default is               repository name, extracted from repository path)    -R REV     Query revision REV for commit information (for tests)    -A AUTHOR  Check commit as if AUTHOR had commited it (for tests)    -h         Show this message"""class MissingArgumentsException(Exception):    "Thrown when required arguments are missing."    passdef parse_options():    try:        opts, args = getopt.getopt(sys.argv[1:], "f:s:r:t:R:A:h", ["help"])    except getopt.GetoptError, e:        raise Error, e.msg    class Options: pass    obj = Options()    obj.filename = None    obj.section = None    obj.repository = None    obj.transaction = None    obj.revision = None    obj.author = None    for opt, val in opts:        if opt == "-f":            obj.filename = val        elif opt == "-s":            obj.section = val        elif opt == "-r":            obj.repository = val        elif opt == "-t":            obj.transaction = val        elif opt == "-R":            obj.revision = val        elif opt == "-A":            obj.author = val        elif opt in ["-h", "--help"]:            sys.stdout.write(USAGE)            sys.exit(0)    missingopts = []    if not obj.repository:        missingopts.append("repository")    if not (obj.transaction or obj.revision):        missingopts.append("either transaction or a revision")    if missingopts:        raise MissingArgumentsException, \              "missing required option(s): " + ", ".join(missingopts)    obj.repository = os.path.abspath(obj.repository)    if obj.filename is None:        obj.filename = os.path.join(obj.repository, "conf", "svnperms.conf")    if obj.section is None:        obj.section = os.path.basename(obj.repository)    if not (os.path.isdir(obj.repository) and            os.path.isdir(os.path.join(obj.repository, "db")) and            os.path.isdir(os.path.join(obj.repository, "hooks")) and            os.path.isfile(os.path.join(obj.repository, "format"))):        raise Error, "path '%s' doesn't look like a repository" % \                     obj.repository            return objdef main():    try:        opts = parse_options()        check_perms(opts.filename, opts.section,                    opts.repository, opts.transaction, opts.revision,                    opts.author)    except MissingArgumentsException, e:        sys.stderr.write("%s\n" % str(e))        sys.stderr.write(USAGE)        sys.exit(1)    except Error, e:        sys.stderr.write("error: %s\n" % str(e))        sys.exit(1)if __name__ == "__main__":    main()# vim:et:ts=4:sw=4

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人av在线电影| 色综合久久中文综合久久97| 国产99久久久国产精品潘金| 97se亚洲国产综合在线| 91精品国产高清一区二区三区蜜臀| 欧美成人激情免费网| 亚洲色图视频网| 麻豆一区二区99久久久久| 91在线高清观看| 日韩免费观看高清完整版 | 免费成人美女在线观看.| 中文字幕中文乱码欧美一区二区| 日韩国产精品久久久久久亚洲| 成人在线视频首页| 在线观看91视频| 欧美激情一区二区| 麻豆国产欧美日韩综合精品二区| 91美女视频网站| 欧美mv和日韩mv的网站| 亚洲h精品动漫在线观看| 96av麻豆蜜桃一区二区| 91麻豆精品国产无毒不卡在线观看| 精品国产伦一区二区三区免费| 一区二区三区在线影院| 国产成人精品亚洲日本在线桃色| 91丨九色丨尤物| 久久久久久久电影| 日韩av一区二| 欧美老肥妇做.爰bbww视频| 亚洲欧洲精品天堂一级| 国产精品911| 国产精品久久久久久久久搜平片| 国产成人日日夜夜| 亚洲欧美日韩成人高清在线一区| 色狠狠桃花综合| 中文欧美字幕免费| 成人激情黄色小说| 中文在线资源观看网站视频免费不卡| 极品少妇xxxx精品少妇| 久久久无码精品亚洲日韩按摩| 久久精品免费看| 久久久精品中文字幕麻豆发布| 国产在线观看一区二区| 国产日韩欧美一区二区三区乱码| 国产成人亚洲精品狼色在线| 中文字幕免费观看一区| fc2成人免费人成在线观看播放| 国产精品不卡视频| 欧美日韩国产在线观看| 极品美女销魂一区二区三区免费| 久久久久久久久一| 成人av免费在线| 亚洲伊人色欲综合网| 日韩精品一区二区三区中文精品| 国模冰冰炮一区二区| 亚洲欧美日韩小说| 日韩欧美美女一区二区三区| 成人免费精品视频| 视频一区二区三区入口| 国产欧美视频一区二区| 欧美日韩一区二区三区不卡| 国产一区欧美一区| 一区二区在线观看免费| 精品乱码亚洲一区二区不卡| 99国产精品久久久久| 欧美日本韩国一区二区三区视频| 国产精品一区二区男女羞羞无遮挡| 亚洲免费在线视频一区 二区| 日韩一区二区三区高清免费看看| 91丝袜美腿高跟国产极品老师| 久久av资源网| 偷拍亚洲欧洲综合| 成人免费在线观看入口| 久久久久久久久久久久久久久99 | 国产香蕉久久精品综合网| 欧美午夜精品免费| 成人精品高清在线| 国产一区二区伦理| 麻豆极品一区二区三区| 日韩高清不卡一区二区三区| 亚洲老妇xxxxxx| 日本一区二区三区久久久久久久久不| 日韩一级大片在线| 欧美一区永久视频免费观看| 欧美日韩高清影院| 欧美日韩卡一卡二| 在线观看精品一区| 成人av在线资源| 成人免费黄色大片| 99久久久国产精品| 9i看片成人免费高清| 色综合中文综合网| 成人午夜激情片| 国产精品资源网站| 久久99精品国产| 蜜桃av一区二区在线观看| 日韩avvvv在线播放| 亚洲综合精品自拍| 亚洲天堂2014| 一区二区中文字幕在线| 精品国产一区二区三区忘忧草 | 日韩欧美在线不卡| 精品剧情在线观看| 日韩精品综合一本久道在线视频| 欧美一区二区三区在线视频| 日韩精品一区二区三区视频在线观看 | 自拍偷拍亚洲激情| 亚洲午夜羞羞片| 久久精品国产在热久久| 成人免费黄色大片| 欧洲一区二区三区在线| 91.xcao| 欧美国产日产图区| 亚洲综合色区另类av| 久久精品国产久精国产| 成人午夜视频福利| 91精品国产入口| 亚洲国产精品二十页| 亚洲成人av中文| 国产精品一区在线| 欧美日韩日日摸| 国产精品你懂的在线| 午夜精品久久久久久不卡8050| 极品少妇一区二区| 欧美日韩你懂的| 国产欧美一区二区精品久导航 | 亚洲精品日日夜夜| 日本午夜精品一区二区三区电影 | 精品国产三级电影在线观看| 成人免费在线播放视频| 精品无人区卡一卡二卡三乱码免费卡| 成人精品视频.| 精品国产髙清在线看国产毛片| 亚洲理论在线观看| 国产69精品一区二区亚洲孕妇| 91精品国产入口| 亚洲电影一级黄| 92国产精品观看| 一区二区三区在线免费观看| 国产精品1区二区.| 久久婷婷久久一区二区三区| 六月丁香综合在线视频| 欧美一级夜夜爽| 狠狠色综合日日| 久久婷婷色综合| 国产成人综合网站| 久久精品视频一区| 国产91清纯白嫩初高中在线观看 | 亚洲最大成人综合| 色狠狠桃花综合| 午夜在线成人av| 欧美三区在线观看| 亚洲电影欧美电影有声小说| 制服.丝袜.亚洲.另类.中文| 免费三级欧美电影| 久久免费美女视频| 成人妖精视频yjsp地址| 中文字幕亚洲一区二区va在线| 成人午夜精品一区二区三区| 亚洲精品国久久99热| 欧美日韩国产不卡| 国产伦精品一区二区三区视频青涩| 欧美国产一区在线| 97超碰欧美中文字幕| 人人超碰91尤物精品国产| 国产午夜精品一区二区三区视频 | 国产91丝袜在线播放九色| 一区二区三区中文免费| 精品噜噜噜噜久久久久久久久试看| 国产精品资源网| 亚洲不卡av一区二区三区| 久久网站热最新地址| 色狠狠色狠狠综合| 国产一区二区调教| 亚洲一区二区黄色| 久久嫩草精品久久久久| 欧美午夜电影网| 国产a级毛片一区| 日本视频一区二区| 亚洲免费伊人电影| 久久蜜臀精品av| 7777精品伊人久久久大香线蕉超级流畅 | 国内精品伊人久久久久影院对白| 亚洲欧美区自拍先锋| 久久综合色8888| 欧美日高清视频| 欧美少妇一区二区| 国产成人久久精品77777最新版本| 亚洲国产精品天堂| 亚洲欧美精品午睡沙发| 欧美国产综合一区二区| 26uuu色噜噜精品一区二区| 欧美一区二区三区在线| 欧美日韩日本视频| 在线一区二区视频| 91免费看片在线观看| 99久久精品国产一区| 成人午夜大片免费观看| 国产成人免费视频网站高清观看视频| 久久99精品国产91久久来源|