~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/patches.py

  • Committer: Martin Pool
  • Date: 2007-08-20 05:48:40 UTC
  • mfrom: (2727 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2737.
  • Revision ID: mbp@sourcefrog.net-20070820054840-x2ugmd9dc4yodw9o
merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# You should have received a copy of the GNU General Public License
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
17
import re
17
18
 
18
19
 
19
20
class PatchSyntax(Exception):
94
95
 
95
96
 
96
97
def hunk_from_header(line):
97
 
    if not line.startswith("@@") or not line.endswith("@@\n") \
98
 
        or not len(line) > 4:
99
 
        raise MalformedHunkHeader("Does not start and end with @@.", line)
 
98
    matches = re.match(r'\@\@ ([^@]*) \@\@( (.*))?\n', line)
 
99
    if matches is None:
 
100
        raise MalformedHunkHeader("Does not match format.", line)
100
101
    try:
101
 
        (orig, mod) = line[3:-4].split(" ")
102
 
    except Exception, e:
 
102
        (orig, mod) = matches.group(1).split(" ")
 
103
    except (ValueError, IndexError), e:
103
104
        raise MalformedHunkHeader(str(e), line)
104
105
    if not orig.startswith('-') or not mod.startswith('+'):
105
106
        raise MalformedHunkHeader("Positions don't start with + or -.", line)
106
107
    try:
107
108
        (orig_pos, orig_range) = parse_range(orig[1:])
108
109
        (mod_pos, mod_range) = parse_range(mod[1:])
109
 
    except Exception, e:
 
110
    except (ValueError, IndexError), e:
110
111
        raise MalformedHunkHeader(str(e), line)
111
112
    if mod_range < 0 or orig_range < 0:
112
113
        raise MalformedHunkHeader("Hunk range is negative", line)
113
 
    return Hunk(orig_pos, orig_range, mod_pos, mod_range)
 
114
    tail = matches.group(3)
 
115
    return Hunk(orig_pos, orig_range, mod_pos, mod_range, tail)
114
116
 
115
117
 
116
118
class HunkLine:
170
172
 
171
173
 
172
174
class Hunk:
173
 
    def __init__(self, orig_pos, orig_range, mod_pos, mod_range):
 
175
    def __init__(self, orig_pos, orig_range, mod_pos, mod_range, tail=None):
174
176
        self.orig_pos = orig_pos
175
177
        self.orig_range = orig_range
176
178
        self.mod_pos = mod_pos
177
179
        self.mod_range = mod_range
 
180
        self.tail = tail
178
181
        self.lines = []
179
182
 
180
183
    def get_header(self):
181
 
        return "@@ -%s +%s @@\n" % (self.range_str(self.orig_pos, 
182
 
                                                   self.orig_range),
183
 
                                    self.range_str(self.mod_pos, 
184
 
                                                   self.mod_range))
 
184
        if self.tail is None:
 
185
            tail_str = ''
 
186
        else:
 
187
            tail_str = ' ' + self.tail
 
188
        return "@@ -%s +%s @@%s\n" % (self.range_str(self.orig_pos,
 
189
                                                     self.orig_range),
 
190
                                      self.range_str(self.mod_pos,
 
191
                                                     self.mod_range),
 
192
                                      tail_str)
185
193
 
186
194
    def range_str(self, pos, range):
187
195
        """Return a file range, special-casing for 1-line files.