Metin Akdere yazdı 28-10-2011 19:59 tarihinde:
> lspisi betiğini güncelledim, son halinden notlar şöyle:
> 
> * Betik *en az bir* argüman alacak şekilde düzenlendi. Argümanlar dizin
> ya da paketler, ya da her ikisi birden olabilir.
> 
> * Renklendirme seçeneği --no-color parametresi ile kapatılabilir.
> 
> * --config, --data vs gibi seçenekleri ekleyebiliriz ama, bence bunlar
> "pisi info -F" için daha uygun.


Yamanın uygulanmasını kolaylaştırmak için svndiff'le oluşturulmuş halini
gönderiyorum. Önceki ile trunk'taki Pisi'ye uygulamasının biraz sancılı
olduğunu farkettik Fatih ile.

-- 
Metin Akdere
Index: scripts/lspisi
===================================================================
--- scripts/lspisi	(revision 38425)
+++ scripts/lspisi	(working copy)
@@ -10,51 +10,142 @@
 #
 # Please read the COPYING file.
 
+from optparse import OptionParser
+
+import glob
 import os
 import sys
 import pisi
 
+
+class PackageNotFoundError(Exception):
+    def __init__(self, message):
+        print colorize("%s\n" % message, "red")
+        sys.exit(1)
+
+
+desc = """lspisi is a utility script that lists the content of the PiSi packages.
+You can supply arbitrary number of PiSi packages or directories that contain
+PiSi packages.
+lspisi lists the results seperately for each package.
+lspisi utility can list only directories in the package as well,
+which is useful for package developer.
+"""
+
+def colorize(msg, color, no_color=False):
+    """Colorizes the given message."""
+
+    if no_color:
+        return msg
+
+    colors = {'green'   : '\x1b[32;01m%s\x1b[0m',
+              'red'     : '\x1b[31;01m%s\x1b[0m',
+              'yellow'  : '\x1b[33;01m%s\x1b[0m',
+              'bold'    : '\x1b[1;01m%s\x1b[0m',
+              'none'    : '\x1b[0m%s\x1b[0m',
+             }
+    return colors[color if sys.stdout.isatty() else 'none'] % msg
+
 def show_info(filename):
+    """ Get file paths in the package """
+
     metadata, files = pisi.api.info_file(filename)
 
     paths = [fileinfo.path for fileinfo in files.list]
     paths.sort()
     return paths
 
+def show_dirs(filename):
+    """ Get only directories in the package. This is a option esp. for
+        package developers
+    """
+
+    dirlist = []
+    for file in show_info(filename):
+        dirlist.append(os.path.dirname(file))
+
+    return uniq(dirlist)
+
 def uniq(alist):
     set = {}
     return [set.setdefault(e, e) for e in alist if e not in set]
 
-def usage(errmsg):
-    print """
-    Error: %s
+def parse_options():
+    """ Parse command line options """
 
-    Usage:
-      lspisi PiSi_package.PiSi         (lists the content of package)
-      lspisi dirs PiSi_package.PiSi    (lists directories in the package for the package developer)
-    """ % (errmsg)
+    # To parse command line options, first instantiate OptionParser
+    parser = OptionParser(description=desc,
+                          usage= "Usage:  %prog [OPTION] [foo.pisi foo2.pisi..] \
+                          \n\t%prog [OPTION] [--dirs]")
 
-    sys.exit(1)
+    # Add option for directory listing
+    parser.add_option("-d", "--dirs",
+                      action="store_true",
+                      dest="dirs",
+                      default=False,
+                      help= "List directories in the package, useful for the \
+                             package developers")
+    # Use colorful output or not
+    parser.add_option("-n", "--no-color",
+                      action="store_true",
+                      dest="no_color",
+                      default=False,
+                      help= "Do not use colorful output")
 
+   # Return parse results
+    return parser
 
-def main():
-    if len(sys.argv) < 2 or ("dirs" in sys.argv and len(sys.argv) < 3):
-        usage("PiSi package required...")
+def print_header(package):
+    """ Common printing properties to display results per package """
 
-    if sys.argv[1] == "dirs":
-        dirlist = []
-        for file in show_info(sys.argv[2]):
-            dirlist.append(os.path.dirname(file))
+    header = "\nPackage: %s"
 
-        for dir in uniq(dirlist):
-            print "<Path fileType=\"\">/%s</Path>" % dir
+    pisi_package = pisi.package.Package(package)
+    package_name = pisi_package.get_metadata().package.name
+    print colorize(header % package_name, "yellow")
+    print colorize("%s\n" % (len(header + package_name) * "="), "yellow")
 
-    elif not os.path.exists(sys.argv[1]):
-        print "File %s not found" % sys.argv[1]
+def main():
+    # Parse options
+    parser = parse_options()
+    options, args = parser.parse_args()
+    no_color = options.no_color
+    #packages = args
 
+    if len(args) == 0:
+        print colorize("You need to specify at least one PiSi package\n", \
+                       "red", no_color)
+        parser.print_usage()
+        sys.exit(1)
     else:
-        for file in show_info(sys.argv[1]):
-            print "/%s" % file
+        pisi_packages = []
 
+        for arg in args:
+            # Handle each argument. Maybe PiSi packages or directories
+            if os.path.exists(arg):
+                if os.path.isdir(arg):
+                    # A directory is given as an argument. List contents of
+                    # packages in that directory
+                    dirname = os.path.dirname(arg + "/")
+                    ret = glob.glob("%s/*.pisi" % dirname)
+                    if len(ret) > 0:
+                        pisi_packages.extend(ret)
+                elif arg.endswith(".pisi"):
+                    pisi_packages.append(arg)
+            else:
+                raise PackageNotFoundError("Cannot open package file %s" % arg)
+
+        for package in pisi_packages:
+            print_header(package)
+            if options.dirs:
+                # Print only directories in the packages
+                for path in show_dirs(package):
+                    print "<Path fileType=\"\">/%s</Path>" % path
+            else:
+                # List all files in the package
+                for _file in show_info(package):
+                    print "/%s" % _file
+
+
 if __name__ == "__main__":
     sys.exit(main())

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Gelistirici mailing list
Gelistirici@pardus.org.tr
http://liste.pardus.org.tr/mailman/listinfo/gelistirici

Cevap