aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGuido Günther <agx@sigxcpu.org>2011-07-29 19:12:16 +0200
committerGuido Günther <agx@sigxcpu.org>2011-07-29 19:17:46 +0200
commit00c2b8e57e3b1482af30cd85e14645724c1af706 (patch)
tree9b8419cbacb324dccea3fa029d51e5ffc540e86b
parent6ce1c65434dddd8678c6c90ad608b82516977a26 (diff)
Move GbpPatchQueue and GbpPatch into gbp.pq
-rwxr-xr-xgbp-pq119
-rw-r--r--gbp/pq.py137
2 files changed, 139 insertions, 117 deletions
diff --git a/gbp-pq b/gbp-pq
index 138abfc1..5ec73736 100755
--- a/gbp-pq
+++ b/gbp-pq
@@ -30,128 +30,13 @@ from gbp.command_wrappers import (Command, GitCommand, RunAtCommand,
GitBranch, CommandExecFailed)
from gbp.errors import GbpError
import gbp.log
+from gbp.pq import PatchQueue
PQ_BRANCH_PREFIX = "patch-queue/"
PATCH_DIR = "debian/patches/"
SERIES_FILE = os.path.join(PATCH_DIR,"series")
-class GbpPatch(object):
- """
- A patch in a patchqueue
-
- @ivar path: path to the patch
- @type path: string
- @ivar topic: the topic of the patch
- @type topic: string
- @ivar strip: path components to strip (think patch -p<strip>)
- @type strip: integer
- """
- def __init__(self, path, topic=None, strip=None):
- self.path = path
- self.topic = topic
- self.strip = strip
-
- def __repr__(self):
- repr = "<gbp_pq.GbpPatch path='%s' " % self.path
- if self.topic:
- repr += "topic='%s' " % self.topic
- if self.strip != None:
- repr += "strip=%d " % self.strip
- repr += ">"
- return repr
-
-
-class GbpPatchQueue(list):
- @classmethod
- def read_series_file(klass, seriesfile):
- """Read a series file into GbpPatch objects"""
- patch_dir = os.path.dirname(seriesfile)
- try:
- s = file(seriesfile)
- except Exception, err:
- raise GbpError("Cannot open series file: %s" % err)
-
- queue = klass._read_series(s, patch_dir)
- s.close()
- return queue
-
- @classmethod
- def _read_series(klass, series, patch_dir):
- """
- Read patch series
- @param series: series of patches in quilt format
- @type series: iterable of strings
- @param patch_dir: path prefix to prepend to each patch path
- @type patch_dir: string
-
- >>> GbpPatchQueue._read_series(['a/b', \
- 'a -p1', \
- 'a/b -p2'], '.') # doctest:+NORMALIZE_WHITESPACE
- [<gbp_pq.GbpPatch path='./a/b' topic='a' >,
- <gbp_pq.GbpPatch path='./a' strip=1 >,
- <gbp_pq.GbpPatch path='./a/b' topic='a' strip=2 >]
- """
-
- queue = GbpPatchQueue()
- for line in series:
- queue.append(klass._parse_line(line, patch_dir))
- return queue
-
- @staticmethod
- def _get_topic(line):
- """
- Get the topic from the path's path
- >>> GbpPatchQueue._get_topic("a/b c")
- 'a'
- >>> GbpPatchQueue._get_topic("asdf")
- >>> GbpPatchQueue._get_topic("/asdf")
- """
- topic = os.path.dirname(line)
- if topic in [ '', '/' ]:
- topic = None
- return topic
-
- @staticmethod
- def _split_strip(line):
- """
- Separate the -p<num> option from the patch name
-
- >>> GbpPatchQueue._split_strip("asdf -p1")
- ('asdf', 1)
- >>> GbpPatchQueue._split_strip("a/nice/patch")
- ('a/nice/patch', None)
- >>> GbpPatchQueue._split_strip("asdf foo")
- ('asdf foo', None)
- """
- patch = line
- strip = None
-
- split = line.rsplit(None, 1)
- if len(split) > 1:
- m = re.match('-p(?P<level>[0-9]+)', split[1])
- if m:
- patch = split[0]
- strip = int(m.group('level'))
-
- return (patch, strip)
-
- @classmethod
- def _parse_line(klass, line, patch_dir):
- """
- Parse a single line from a patch file
-
- >>> GbpPatchQueue._parse_line("a/b -p1", '/tmp/patches')
- <gbp_pq.GbpPatch path='/tmp/patches/a/b' topic='a' strip=1 >
- >>> GbpPatchQueue._parse_line("a/b", '.')
- <gbp_pq.GbpPatch path='./a/b' topic='a' >
- """
- line = line.rstrip()
- topic = klass._get_topic(line)
- (patch, split) = klass._split_strip(line)
- return GbpPatch(os.path.join(patch_dir, patch), topic, split)
-
-
def is_pq_branch(branch):
"""
is branch a patch-queue branch?
@@ -298,7 +183,7 @@ def import_quilt_patches(repo, branch, series):
% pq_branch)
repo.set_branch(pq_branch)
- queue = GbpPatchQueue.read_series_file(series)
+ queue = PatchQueue.read_series_file(series)
for patch in queue:
gbp.log.debug("Applying %s" % patch.path)
apply_and_commit_patch(repo, patch.path, patch.topic)
diff --git a/gbp/pq.py b/gbp/pq.py
new file mode 100644
index 00000000..39eb6a07
--- /dev/null
+++ b/gbp/pq.py
@@ -0,0 +1,137 @@
+# vim: set fileencoding=utf-8 :
+#
+# (C) 2011 Guido Guenther <agx@sigxcpu.org>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import os
+import re
+from errors import GbpError
+
+class Patch(object):
+ """
+ A patch in a patchqueue
+
+ @ivar path: path to the patch
+ @type path: string
+ @ivar topic: the topic of the patch
+ @type topic: string
+ @ivar strip: path components to strip (think patch -p<strip>)
+ @type strip: integer
+ """
+ def __init__(self, path, topic=None, strip=None):
+ self.path = path
+ self.topic = topic
+ self.strip = strip
+
+ def __repr__(self):
+ repr = "<gbp.pq.Patch path='%s' " % self.path
+ if self.topic:
+ repr += "topic='%s' " % self.topic
+ if self.strip != None:
+ repr += "strip=%d " % self.strip
+ repr += ">"
+ return repr
+
+
+class PatchQueue(list):
+ @classmethod
+ def read_series_file(klass, seriesfile):
+ """Read a series file into gbp.pq.Patch objects"""
+ patch_dir = os.path.dirname(seriesfile)
+ try:
+ s = file(seriesfile)
+ except Exception, err:
+ raise GbpError("Cannot open series file: %s" % err)
+
+ queue = klass._read_series(s, patch_dir)
+ s.close()
+ return queue
+
+ @classmethod
+ def _read_series(klass, series, patch_dir):
+ """
+ Read patch series
+ @param series: series of patches in quilt format
+ @type series: iterable of strings
+ @param patch_dir: path prefix to prepend to each patch path
+ @type patch_dir: string
+
+ >>> PatchQueue._read_series(['a/b', \
+ 'a -p1', \
+ 'a/b -p2'], '.') # doctest:+NORMALIZE_WHITESPACE
+ [<gbp.pq.Patch path='./a/b' topic='a' >,
+ <gbp.pq.Patch path='./a' strip=1 >,
+ <gbp.pq.Patch path='./a/b' topic='a' strip=2 >]
+ """
+
+ queue = PatchQueue()
+ for line in series:
+ queue.append(klass._parse_line(line, patch_dir))
+ return queue
+
+ @staticmethod
+ def _get_topic(line):
+ """
+ Get the topic from the path's path
+ >>> PatchQueue._get_topic("a/b c")
+ 'a'
+ >>> PatchQueue._get_topic("asdf")
+ >>> PatchQueue._get_topic("/asdf")
+ """
+ topic = os.path.dirname(line)
+ if topic in [ '', '/' ]:
+ topic = None
+ return topic
+
+ @staticmethod
+ def _split_strip(line):
+ """
+ Separate the -p<num> option from the patch name
+
+ >>> PatchQueue._split_strip("asdf -p1")
+ ('asdf', 1)
+ >>> PatchQueue._split_strip("a/nice/patch")
+ ('a/nice/patch', None)
+ >>> PatchQueue._split_strip("asdf foo")
+ ('asdf foo', None)
+ """
+ patch = line
+ strip = None
+
+ split = line.rsplit(None, 1)
+ if len(split) > 1:
+ m = re.match('-p(?P<level>[0-9]+)', split[1])
+ if m:
+ patch = split[0]
+ strip = int(m.group('level'))
+
+ return (patch, strip)
+
+ @classmethod
+ def _parse_line(klass, line, patch_dir):
+ """
+ Parse a single line from a patch file
+
+ >>> PatchQueue._parse_line("a/b -p1", '/tmp/patches')
+ <gbp.pq.Patch path='/tmp/patches/a/b' topic='a' strip=1 >
+ >>> PatchQueue._parse_line("a/b", '.')
+ <gbp.pq.Patch path='./a/b' topic='a' >
+ """
+ line = line.rstrip()
+ topic = klass._get_topic(line)
+ (patch, split) = klass._split_strip(line)
+ return Patch(os.path.join(patch_dir, patch), topic, split)
+
+