|
Gaudi Framework, version v22r2 |
| Home | Generated: Tue May 10 2011 |
Functions | |
| def | command |
| def | broadcast_packages |
| def | matches |
| def | expand_dirs |
| def | revision_diff_cmd |
| def | diff_pkg |
| def | main |
Variables | |
| tuple | cmt = lambda*args,**kwargs:apply(command, ("cmt",) + args, kwargs) |
| tuple | cvs = lambda*args,**kwargs:apply(command, ("cvs",) + args, kwargs) |
| tuple | svn = lambda*args,**kwargs:apply(command, ("svn",) + args, kwargs) |
| def make_patch::broadcast_packages | ( | ) |
Find the local packages the current one depends on (using 'cmt broadcast').
Returns a list of pairs ("package name","path to the cmt directory").
Definition at line 23 of file make_patch.py.
00024 : 00025 """ 00026 Find the local packages the current one depends on (using 'cmt broadcast'). 00027 Returns a list of pairs ("package name","path to the cmt directory"). 00028 """ 00029 # make cmt print one line per package with python syntax 00030 if not sys.platform.startswith("win"): 00031 pkg_dirs = "[\n" + cmt("broadcast",r'echo "(\"<package>\", \"$PWD\"),"')[0] + ']' 00032 else: 00033 pkg_dirs = "[\n" + cmt("broadcast",r'echo ("<package>", r"%<package>root%\cmt"),')[0] + ']' 00034 # Clean up a bit the output (actually needed only on Windows because of the newlines) 00035 pkg_dirs = "\n".join([l.strip() for l in pkg_dirs.splitlines() if not l.startswith("#")]) 00036 return eval(pkg_dirs)
| def make_patch::command | ( | cmd, | |
| args, | |||
| kwargs | |||
| ) |
Simple wrapper to execute a command and return standard output and standard error.
Definition at line 8 of file make_patch.py.
00009 : 00010 """ 00011 Simple wrapper to execute a command and return standard output and standard error. 00012 """ 00013 d = {"stdout": PIPE, "stderr": PIPE} 00014 d.update(kwargs) 00015 cmd = [cmd] + list(args) 00016 logging.debug("Execute command: %r %r", " ".join(cmd), kwargs) 00017 proc = apply(Popen, (cmd,), d) 00018 return proc.communicate()
| def make_patch::diff_pkg | ( | name, | |
| cmtdir, | |||
exclusions = [] |
|||
| ) |
Return the patch data for a package.
Definition at line 83 of file make_patch.py.
00084 : 00085 """ 00086 Return the patch data for a package. 00087 """ 00088 rootdir = os.path.dirname(cmtdir) 00089 out, err = revision_diff_cmd(cwd = rootdir) 00090 # extract new files 00091 new_files = [ l.split(None,1)[1] 00092 for l in out.splitlines() 00093 if l.startswith("? ") ] 00094 new_files = expand_dirs(new_files, rootdir) 00095 new_files = [ f 00096 for f in new_files 00097 if not matches(f, exclusions) ] 00098 # make diff segments for added files 00099 for f in new_files: 00100 logging.info("Added file %r", f) 00101 #out += "diff -u -p -N %s\n" % os.path.basename(f) 00102 #out += command("diff", "-upN", "/dev/null", f, 00103 # cwd = rootdir)[0] 00104 out += "Index: %s\n" % f 00105 out += "===================================================================\n" 00106 out += command("diff", "-upN", "/dev/null", f, 00107 cwd = rootdir)[0] 00108 # extract removed files 00109 removed_files = [ l.split()[-1] 00110 for l in err.splitlines() 00111 if "cannot find" in l ] 00112 removed_files = [ f 00113 for f in removed_files 00114 if not matches(f, exclusions) ] 00115 # make diff segments for removed files (more tricky) 00116 for f in removed_files: 00117 logging.info("Removed file %r", f) 00118 # retrieve the original content from CVS 00119 orig = cvs("up", "-p", f, 00120 cwd = rootdir)[0] 00121 out += "diff -u -p -N %s\n" % os.path.basename(f) 00122 out += "--- %s\t1 Jan 1970 00:00:00 -0000\n" % f 00123 out += "+++ /dev/null\t1 Jan 1970 00:00:00 -0000\n" 00124 lines = orig.splitlines() 00125 out += "@@ -1,%d +0,0 @@\n" % len(lines) 00126 for l in lines: 00127 out += '-%s\n' % l 00128 # Fix the paths to have the package names 00129 rex = re.compile(r"^(Index: |\? |\+\+\+ |--- (?!/dev/null))", re.MULTILINE) 00130 out = rex.sub(r"\1%s/" % name, out) 00131 return out
| def make_patch::expand_dirs | ( | files, | |
basepath = "" |
|||
| ) |
Replace the entries in files that correspond to directories with the list of files in those directories.
Definition at line 48 of file make_patch.py.
00049 : 00050 """ 00051 Replace the entries in files that correspond to directories with the list of 00052 files in those directories. 00053 """ 00054 if basepath: 00055 lb = len(basepath)+1 00056 else: 00057 lb = 0 00058 newlist = [] 00059 for f in files: 00060 base = os.path.join(basepath, f) 00061 if os.path.isdir(base): 00062 for root, ds, fs in os.walk(base): 00063 for ff in fs: 00064 newlist.append(os.path.join(root,ff)[lb:]) 00065 else: 00066 newlist.append(f) 00067 return newlist
| def make_patch::main | ( | ) |
Definition at line 132 of file make_patch.py.
00133 : 00134 from optparse import OptionParser 00135 parser = OptionParser(description = "Produce a patch file from a CMT project. " 00136 "The patch contains the changes with respect " 00137 "to the CVS repository, including new files " 00138 "that are present only locally. Run the script " 00139 "from the cmt directory of a package." ) 00140 parser.add_option("-x", "--exclude", action="append", type="string", 00141 metavar="PATTERN", dest="exclusions", 00142 help="Pattern to exclude new files from the patch") 00143 parser.add_option("-o", "--output", action="store", type="string", 00144 help="Name of the file to send the output to. Standard " 00145 "output is used if not specified") 00146 parser.add_option("-v", "--verbose", action="store_true", 00147 help="Print some progress information on standard error") 00148 parser.add_option("--debug", action="store_true", 00149 help="Print debug information on standard error") 00150 parser.set_defaults(exclusions = []) 00151 00152 opts, args = parser.parse_args() 00153 00154 if opts.debug: 00155 logging.basicConfig(level = logging.DEBUG) 00156 elif opts.verbose: 00157 logging.basicConfig(level = logging.INFO) 00158 00159 # default exclusions 00160 opts.exclusions += [ "*.py[co]", 00161 "*.patch", 00162 "cmt/cleanup.*", 00163 "cmt/setup.*", 00164 "cmt/*.make", 00165 "cmt/Makefile", 00166 "cmt/*.nmake", 00167 "cmt/*.nmakesav", 00168 "cmt/NMake", 00169 "cmt/install*.history", 00170 "cmt/build.*.log", 00171 "cmt/version.cmt", 00172 "genConf", 00173 "slc3_ia32_gcc323*", 00174 "slc4_ia32_gcc34*", 00175 "slc4_amd64_gcc34*", 00176 "slc4_amd64_gcc43*", 00177 "win32_vc71*", 00178 "i686-slc3-gcc323*", 00179 "i686-slc4-gcc34*", 00180 "i686-slc4-gcc41*", 00181 "x86_64-slc4-gcc34*", 00182 "x86_64-slc4-gcc41*", 00183 "i686-slc5-gcc43*", 00184 "x86_64-slc5-gcc43*", 00185 "x86_64-slc5-icc*", 00186 ] 00187 if "CMTCONFIG" in os.environ: 00188 opts.exclusions.append(os.environ["CMTCONFIG"]) 00189 00190 # check if we are in the cmt directory before broadcasting 00191 if not (os.path.basename(os.getcwd()) == "cmt" and os.path.exists("requirements")): 00192 logging.error("This script must be executed from the cmt directory of a package.") 00193 return 1 00194 00195 pkgs = broadcast_packages() 00196 num_pkgs = len(pkgs) 00197 count = 0 00198 00199 patch = "" 00200 for name, path in pkgs: 00201 count += 1 00202 logging.info("Processing %s from %s (%d/%d)", 00203 name, os.path.dirname(path), count, num_pkgs) 00204 patch += diff_pkg(name, path, opts.exclusions) 00205 00206 if sys.platform.startswith("win"): 00207 # fix newlines chars 00208 patch = patch.replace("\r","") 00209 00210 if opts.output: 00211 logging.info("Writing patch file %r", opts.output) 00212 open(opts.output,"w").write(patch) 00213 else: 00214 sys.stdout.write(patch) 00215 return 0
| def make_patch::matches | ( | filename, | |
| patterns | |||
| ) |
Returns True if any of the specified glob patterns (list of strings) matched the string 'filename'.
Definition at line 37 of file make_patch.py.
| def make_patch::revision_diff_cmd | ( | cwd ) |
Definition at line 68 of file make_patch.py.
00069 : 00070 if os.path.isdir(os.path.join(cwd, "CVS")): 00071 return cvs("diff", "-upN", cwd = cwd) 00072 else: 00073 # special treatment to show new files in a way compatible with CVS 00074 out, err = svn("status", cwd = cwd) 00075 00076 newfiles = [ l 00077 for l in out.splitlines() 00078 if l.startswith("? ") ] 00079 out, err = svn("diff", cwd = cwd) 00080 if newfiles: 00081 out = "\n".join(newfiles) + "\n" + out 00082 return out, err
| tuple make_patch::cmt = lambda*args,**kwargs:apply(command, ("cmt",) + args, kwargs) |
Definition at line 19 of file make_patch.py.
| tuple make_patch::cvs = lambda*args,**kwargs:apply(command, ("cvs",) + args, kwargs) |
Definition at line 20 of file make_patch.py.
| tuple make_patch::svn = lambda*args,**kwargs:apply(command, ("svn",) + args, kwargs) |
Definition at line 21 of file make_patch.py.