⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buildpkg.py

📁 Wxpython Implemented on Windows CE, Source code
💻 PY
📖 第 1 页 / 共 2 页
字号:
        "Write .bom file containing 'Bill of Materials'."

        # Currently ignores if the 'mkbom' tool is not available.

        try:
            base = self.packageInfo["Title"] + ".bom"
            bomPath = join(self.packageResourceFolder, base)
            cmd = "mkbom %s %s" % (self.sourceFolder, bomPath)
            res = os.system(cmd)
        except:
            pass


    def _addArchive(self):
        "Write .pax.gz file, a compressed archive using pax/gzip."

        # Currently ignores if the 'pax' tool is not available.

        cwd = os.getcwd()

        # create archive
        os.chdir(self.sourceFolder)
        base = basename(self.packageInfo["Title"]) + ".pax"
        self.archPath = join(self.packageResourceFolder, base)
        cmd = "pax -w -f %s %s" % (self.archPath, ".")
        res = os.system(cmd)
        
        # compress archive
        cmd = "gzip %s" % self.archPath
        res = os.system(cmd)
        os.chdir(cwd)


    def _addResources(self):
        "Add Welcome/ReadMe/License files, .lproj folders and scripts."

        # Currently we just copy everything that matches the allowed 
        # filenames. So, it's left to Installer.app to deal with the 
        # same file available in multiple formats...

        if not self.resourceFolder:
            return

        # find candidate resource files (txt html rtf rtfd/ or lproj/)
        allFiles = []
        for pat in string.split("*.txt *.html *.rtf *.rtfd *.lproj", " "):
            pattern = join(self.resourceFolder, pat)
            allFiles = allFiles + glob.glob(pattern)

        # find pre-process and post-process scripts
        # naming convention: packageName.{pre,post}_{upgrade,install}
        # Alternatively the filenames can be {pre,post}_{upgrade,install}
        # in which case we prepend the package name
        packageName = self.packageInfo["Title"]
        for pat in ("*upgrade", "*install", "*flight"):
            pattern = join(self.resourceFolder, packageName + pat)
            pattern2 = join(self.resourceFolder, pat)
            allFiles = allFiles + glob.glob(pattern)
            allFiles = allFiles + glob.glob(pattern2)

        # check name patterns
        files = []
        for f in allFiles:
            for s in ("Welcome", "License", "ReadMe"):
                if string.find(basename(f), s) == 0:
                    files.append((f, f))
            if f[-6:] == ".lproj":
                files.append((f, f))
            elif basename(f) in ["pre_upgrade", "pre_install", "post_upgrade", "post_install"]:
                files.append((f, packageName+"."+basename(f)))
            elif basename(f) in ["preflight", "postflight"]:
                files.append((f, f))
            elif f[-8:] == "_upgrade":
                files.append((f,f))
            elif f[-8:] == "_install":
                files.append((f,f))

        # copy files
        for src, dst in files:
            src = basename(src)
            dst = basename(dst)
            f = join(self.resourceFolder, src)
            if isfile(f):
                shutil.copy(f, os.path.join(self.packageResourceFolder, dst))
            elif isdir(f):
                # special case for .rtfd and .lproj folders...
                d = join(self.packageResourceFolder, dst)
                os.mkdir(d)
                files = GlobDirectoryWalker(f)
                for file in files:
                    shutil.copy(file, d)


    def _addSizes(self):
        "Write .sizes file with info about number and size of files."

        # Not sure if this is correct, but 'installedSize' and 
        # 'zippedSize' are now in Bytes. Maybe blocks are needed? 
        # Well, Installer.app doesn't seem to care anyway, saying 
        # the installation needs 100+ MB...

        numFiles = 0
        installedSize = 0
        zippedSize = 0

        files = GlobDirectoryWalker(self.sourceFolder)
        for f in files:
            numFiles = numFiles + 1
            installedSize = installedSize + os.lstat(f)[6]

        try:
            zippedSize = os.stat(self.archPath+ ".gz")[6]
        except OSError: # ignore error 
            pass
        base = self.packageInfo["Title"] + ".sizes"
        f = open(join(self.packageResourceFolder, base), "w")
        format = "NumFiles %d\nInstalledSize %d\nCompressedSize %d\n"
        f.write(format % (numFiles, installedSize, zippedSize))

    def _addLoc(self):
        "Write .loc file."
        base = self.packageInfo["Title"] + ".loc"
        f = open(join(self.packageResourceFolder, base), "w")
        f.write('/')

# Shortcut function interface

def buildPackage(*args, **options):
    "A Shortcut function for building a package."
    
    o = options
    title, version, desc = o["Title"], o["Version"], o["Description"]
    pm = PackageMaker(title, version, desc)
    apply(pm.build, list(args), options)


######################################################################
# Tests
######################################################################

def test0():
    "Vanilla test for the distutils distribution."

    pm = PackageMaker("distutils2", "1.0.2", "Python distutils package.")
    pm.build("/Users/dinu/Desktop/distutils2")


def test1():
    "Test for the reportlab distribution with modified options."

    pm = PackageMaker("reportlab", "1.10", 
                      "ReportLab's Open Source PDF toolkit.")
    pm.build(root="/Users/dinu/Desktop/reportlab", 
             DefaultLocation="/Applications/ReportLab",
             Relocatable="YES")

def test2():
    "Shortcut test for the reportlab distribution with modified options."

    buildPackage(
        "/Users/dinu/Desktop/reportlab", 
        Title="reportlab", 
        Version="1.10", 
        Description="ReportLab's Open Source PDF toolkit.",
        DefaultLocation="/Applications/ReportLab",
        Relocatable="YES")


######################################################################
# Command-line interface
######################################################################

def printUsage():
    "Print usage message."

    format = "Usage: %s <opts1> [<opts2>] <root> [<resources>]"
    print format % basename(sys.argv[0])
    print
    print "       with arguments:"
    print "           (mandatory) root:         the package root folder"
    print "           (optional)  resources:    the package resources folder"
    print
    print "       and options:"
    print "           (mandatory) opts1:"
    mandatoryKeys = string.split("Title Version Description", " ")
    for k in mandatoryKeys:
        print "               --%s" % k
    print "           (optional) opts2: (with default values)"

    pmDefaults = PackageMaker.packageInfoDefaults
    optionalKeys = pmDefaults.keys()
    for k in mandatoryKeys:
        optionalKeys.remove(k)
    optionalKeys.sort()
    maxKeyLen = max(map(len, optionalKeys))
    for k in optionalKeys:
        format = "               --%%s:%s %%s"
        format = format % (" " * (maxKeyLen-len(k)))
        print format % (k, repr(pmDefaults[k]))


def main():
    "Command-line interface."

    shortOpts = ""
    keys = PackageMaker.packageInfoDefaults.keys()
    longOpts = map(lambda k: k+"=", keys)

    try:
        opts, args = getopt.getopt(sys.argv[1:], shortOpts, longOpts)
    except getopt.GetoptError, details:
        print details
        printUsage()
        return

    optsDict = {}
    for k, v in opts:
        optsDict[k[2:]] = v

    ok = optsDict.keys()
    if not (1 <= len(args) <= 2):
        print "No argument given!"
    elif not ("Title" in ok and \
              "Version" in ok and \
              "Description" in ok):
        print "Missing mandatory option!"
    else:
        apply(buildPackage, args, optsDict)
        return

    printUsage()

    # sample use:
    # buildpkg.py --Title=distutils \
    #             --Version=1.0.2 \
    #             --Description="Python distutils package." \
    #             /Users/dinu/Desktop/distutils


if __name__ == "__main__":
    main()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -