233 lines
6.7 KiB
Plaintext
233 lines
6.7 KiB
Plaintext
|
#! /usr/bin/python
|
||
|
|
||
|
# Basic instructions
|
||
|
#
|
||
|
# 1. Save patch email to file [patch.email]
|
||
|
#
|
||
|
# 2. Go to the svn directory to which you want to apply the patch.
|
||
|
#
|
||
|
# 3. Run "selinux-maint split patch.email". This will run vi on the
|
||
|
# logmsg (pulled out of the email) to allow you to add anything (ack
|
||
|
# messages). When you quit vi the current directory will have files
|
||
|
# called "patch" and "logmsg".
|
||
|
#
|
||
|
# 4. Run "selinux-maint apply" (optionally with a strip level as
|
||
|
# the last argument). This will do a dry run of applying the patch
|
||
|
# showing the results and ask if you want to apply the patch. If you
|
||
|
# say yes it will apply the patch and attempt to detect file adds (by
|
||
|
# comparing svn status and the output of patch). If it finds adds it
|
||
|
# will ask if you want to add each file.
|
||
|
#
|
||
|
# 5. Run "selinux-maint commit" to commit that patch with the log
|
||
|
# message.
|
||
|
#
|
||
|
# 6. Repeat 4 and 5 as often as necessary for a set of patch emails.
|
||
|
#
|
||
|
# 7. Run "selinux-maint rev packagename" where packagename is
|
||
|
# something like "libsepol". This will prompt for the new version
|
||
|
# number (showing the current), update VERSION, add a Changelog entry
|
||
|
# with the version and date, and vi the changelog for you to add
|
||
|
# entries.
|
||
|
#
|
||
|
# 8. Run "selinux-maint commit" again to commit the revision change
|
||
|
# (rev adds a simple log message - I just fixed this as my last
|
||
|
# checkin had the wrong log message).
|
||
|
|
||
|
import sys
|
||
|
import subprocess
|
||
|
import shutil
|
||
|
import os
|
||
|
import os.path
|
||
|
import datetime
|
||
|
|
||
|
dir = "/tmp/selinux-maint/"
|
||
|
|
||
|
def usage():
|
||
|
print "selinux-maint [command] [options]"
|
||
|
print ""
|
||
|
print "commands:"
|
||
|
print "\tsplit patch-email: split patch-email into a patch and log message"
|
||
|
print "\tapply [patch-level]: apply the patch and logmsg with optional level"
|
||
|
print "\tcommit username: commit the changes"
|
||
|
print "\trev package: update the version number and changelog of package"
|
||
|
print "\tmerge reva:revb source-branch: merge changes to the current branch"
|
||
|
|
||
|
def create_tmpdir():
|
||
|
try:
|
||
|
os.mkdir(dir)
|
||
|
except OSError:
|
||
|
if not os.path.isdir(dir):
|
||
|
print "path %s exists and is not a directory" % dir
|
||
|
sys.exit(1)
|
||
|
|
||
|
def split_email(args):
|
||
|
# Get an absolute path for the patch email since we are going to
|
||
|
# change the working directory
|
||
|
patch_path = os.path.abspath(args[0])
|
||
|
|
||
|
create_tmpdir()
|
||
|
prevdir = os.getcwd()
|
||
|
os.chdir(dir)
|
||
|
|
||
|
infd = open(patch_path)
|
||
|
outfd = open("info", "w")
|
||
|
retcode = subprocess.call(["git-mailinfo", "msg", "patch"], stdin=infd,
|
||
|
stdout=outfd)
|
||
|
if retcode != 0:
|
||
|
sys.exit(1)
|
||
|
|
||
|
msgfd = open("logmsg", "w")
|
||
|
retcode = subprocess.call(["cat", "info", "msg"], stdout=msgfd)
|
||
|
|
||
|
msgfd.close()
|
||
|
|
||
|
retcode = subprocess.call(["vi", "logmsg"])
|
||
|
|
||
|
shutil.copyfile("logmsg", prevdir + "/logmsg")
|
||
|
shutil.copyfile("patch", prevdir + "/patch")
|
||
|
|
||
|
def apply(args):
|
||
|
if len(args) >= 1:
|
||
|
patch_level = "-p%d" % int(args[0])
|
||
|
else:
|
||
|
patch_level = "-p1"
|
||
|
|
||
|
if len(args) == 2:
|
||
|
patch_name = "../patch"
|
||
|
patch_dir = args[1]
|
||
|
else:
|
||
|
patch_name = "patch"
|
||
|
patch_dir = None
|
||
|
|
||
|
print "Test applying patch:"
|
||
|
if patch_dir:
|
||
|
os.chdir(patch_dir)
|
||
|
|
||
|
patchfd = open(patch_name)
|
||
|
retcode = subprocess.call(["patch", patch_level, "--dry-run", "-l"], stdin=patchfd)
|
||
|
resp = raw_input("apply [y/n]: ")
|
||
|
if resp != "y":
|
||
|
sys.exit(0)
|
||
|
|
||
|
patchfd = open(patch_name)
|
||
|
patch_output = subprocess.Popen(["patch", patch_level, "-l"], stdin=patchfd,
|
||
|
stdout=subprocess.PIPE).communicate()[0]
|
||
|
|
||
|
status_output = subprocess.Popen(["svn", "status"], stdout=subprocess.PIPE).communicate()[0]
|
||
|
|
||
|
|
||
|
# Detect adds
|
||
|
unknown_files = []
|
||
|
for status_line in status_output.split("\n"):
|
||
|
try:
|
||
|
status, fname = status_line.split()
|
||
|
except ValueError:
|
||
|
continue
|
||
|
if status == "?":
|
||
|
unknown_files.append(fname)
|
||
|
|
||
|
added_files = []
|
||
|
for patch_line in patch_output.split("\n"):
|
||
|
try:
|
||
|
patched_fname = patch_line.split(" ")[2]
|
||
|
except:
|
||
|
continue
|
||
|
if patched_fname in unknown_files:
|
||
|
added_files.append(patched_fname)
|
||
|
|
||
|
for fname in added_files:
|
||
|
input = raw_input("add file %s [y/n]: " % fname)
|
||
|
if input == "y":
|
||
|
subprocess.call(["svn", "add", fname])
|
||
|
|
||
|
def commit(args):
|
||
|
if len(args) == 1:
|
||
|
retcode = subprocess.call(["svn", "commit", "--username", args[0], "-F", "logmsg"])
|
||
|
else:
|
||
|
retcode = subprocess.call(["svn", "commit", "-F", "logmsg"])
|
||
|
|
||
|
|
||
|
def rev(args):
|
||
|
if len(args) != 1:
|
||
|
print "you must provide a package name"
|
||
|
usage()
|
||
|
sys.exit(1)
|
||
|
package = args[0]
|
||
|
|
||
|
ver_fd = open("%s/VERSION" % package, "r")
|
||
|
cur = ver_fd.read()
|
||
|
cur = cur.split("\n")[0]
|
||
|
ver_fd.close()
|
||
|
input = raw_input("new version [current is %s]: " % cur)
|
||
|
new_fd = open("%s/VERSION.new" % package, "w")
|
||
|
new_fd.write(input + "\n")
|
||
|
new_fd.close()
|
||
|
shutil.copyfile("%s/VERSION.new" % package, "%s/VERSION" % package)
|
||
|
|
||
|
old_changelog = "%s/ChangeLog" % package
|
||
|
new_changelog = "%s/ChangeLog.new" % package
|
||
|
|
||
|
n = open(new_changelog, "w")
|
||
|
|
||
|
entry = "%s %s\n" % (input, str(datetime.date.today()))
|
||
|
n.write(entry)
|
||
|
n.write("\t*\n\n")
|
||
|
o = open(old_changelog)
|
||
|
n.write(o.read())
|
||
|
n.close()
|
||
|
o.close()
|
||
|
|
||
|
subprocess.call(["vi", new_changelog])
|
||
|
shutil.copyfile(new_changelog, old_changelog)
|
||
|
|
||
|
logmsg = open("logmsg", "w")
|
||
|
logmsg.write("updated %s to version %s\n" % (package, input))
|
||
|
|
||
|
def merge(args):
|
||
|
if len(args) != 2:
|
||
|
print "you must provide a revision pair and source branch"
|
||
|
usage()
|
||
|
sys.exit(1)
|
||
|
|
||
|
rev = args[0]
|
||
|
branch = args[1]
|
||
|
|
||
|
if branch == "trunk":
|
||
|
url = "https://selinux.svn.sourceforge.net/svnroot/selinux/trunk"
|
||
|
elif branch == "stable":
|
||
|
url = "https://selinux.svn.sourceforge.net/svnroot/selinux/branches/stable/1_0"
|
||
|
else:
|
||
|
url = "https://selinux.svn.sourceforge.net/svnroot/selinux/branches/%s" % branch
|
||
|
|
||
|
subprocess.call(["svn", "diff", "-r%s" % rev, url])
|
||
|
input = raw_input("apply these changes [y/n]? ")
|
||
|
if input != "y":
|
||
|
sys.exit(0)
|
||
|
|
||
|
subprocess.call(["svn", "merge", "-r%s" % rev, url])
|
||
|
|
||
|
logmsg = open("logmsg", "w")
|
||
|
logmsg.write("applied r%s from %s\n" % (rev, branch))
|
||
|
|
||
|
|
||
|
def main():
|
||
|
if len(sys.argv) < 2:
|
||
|
usage()
|
||
|
sys.exit(1)
|
||
|
|
||
|
command = sys.argv[1]
|
||
|
if command == "split":
|
||
|
split_email(sys.argv[2:])
|
||
|
elif command == "apply":
|
||
|
apply(sys.argv[2:])
|
||
|
elif command == "commit":
|
||
|
commit(sys.argv[2:])
|
||
|
elif command == "rev":
|
||
|
rev(sys.argv[2:])
|
||
|
elif command == "merge":
|
||
|
merge(sys.argv[2:])
|
||
|
else:
|
||
|
usage()
|
||
|
|
||
|
main()
|