From 00c2b8e57e3b1482af30cd85e14645724c1af706 Mon Sep 17 00:00:00 2001 From: Guido Günther Date: Fri, 29 Jul 2011 19:12:16 +0200 Subject: Move GbpPatchQueue and GbpPatch into gbp.pq --- gbp/pq.py | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 gbp/pq.py (limited to 'gbp') 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 +# 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) + @type strip: integer + """ + def __init__(self, path, topic=None, strip=None): + self.path = path + self.topic = topic + self.strip = strip + + def __repr__(self): + repr = ">> PatchQueue._read_series(['a/b', \ + 'a -p1', \ + 'a/b -p2'], '.') # doctest:+NORMALIZE_WHITESPACE + [, + , + ] + """ + + 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 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[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') + + >>> PatchQueue._parse_line("a/b", '.') + + """ + line = line.rstrip() + topic = klass._get_topic(line) + (patch, split) = klass._split_strip(line) + return Patch(os.path.join(patch_dir, patch), topic, split) + + -- cgit v1.2.3