~bzr/ubuntu/karmic/dulwich/bzr-ppa

« back to all changes in this revision

Viewing changes to dulwich/patch.py

  • Committer: Max Bowsher
  • Date: 2011-04-13 01:50:24 UTC
  • mfrom: (419.1.20 lucid)
  • Revision ID: maxb@f2s.com-20110413015024-ply0macbxppq7ag1
Tags: 0.7.1-1~bazaar1~karmic1
MergeĀ 0.7.1-1

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
 
25
25
from difflib import SequenceMatcher
26
26
import rfc822
27
 
import subprocess
28
27
import time
29
28
 
30
29
from dulwich.objects import (
31
 
    Blob,
32
30
    Commit,
 
31
    S_ISGITLINK,
33
32
    )
34
33
 
35
34
def write_commit_patch(f, commit, contents, progress, version=None):
47
46
    f.write("\n")
48
47
    f.write("---\n")
49
48
    try:
 
49
        import subprocess
50
50
        p = subprocess.Popen(["diffstat"], stdout=subprocess.PIPE,
51
51
                             stdin=subprocess.PIPE)
52
 
    except OSError, e:
 
52
    except (ImportError, OSError), e:
53
53
        pass # diffstat not available?
54
54
    else:
55
55
        (diffstat, _) = p.communicate(contents)
103
103
                    yield '+' + line
104
104
 
105
105
 
 
106
def write_object_diff(f, store, (old_path, old_mode, old_id),
 
107
                                (new_path, new_mode, new_id)):
 
108
    """Write the diff for an object.
 
109
 
 
110
    :param f: File-like object to write to
 
111
    :param store: Store to retrieve objects from, if necessary
 
112
    :param (old_path, old_mode, old_hexsha): Old file
 
113
    :param (new_path, new_mode, new_hexsha): New file
 
114
 
 
115
    :note: the tuple elements should be None for nonexistant files
 
116
    """
 
117
    def shortid(hexsha):
 
118
        if hexsha is None:
 
119
            return "0" * 7
 
120
        else:
 
121
            return hexsha[:7]
 
122
    def lines(mode, hexsha):
 
123
        if hexsha is None:
 
124
            return []
 
125
        elif S_ISGITLINK(mode):
 
126
            return ["Submodule commit " + hexsha + "\n"]
 
127
        else:
 
128
            return store[hexsha].data.splitlines(True)
 
129
    if old_path is None:
 
130
        old_path = "/dev/null"
 
131
    else:
 
132
        old_path = "a/%s" % old_path
 
133
    if new_path is None:
 
134
        new_path = "/dev/null"
 
135
    else:
 
136
        new_path = "b/%s" % new_path
 
137
    f.write("diff --git %s %s\n" % (old_path, new_path))
 
138
    if old_mode != new_mode:
 
139
        if new_mode is not None:
 
140
            if old_mode is not None:
 
141
                f.write("old mode %o\n" % old_mode)
 
142
            f.write("new mode %o\n" % new_mode)
 
143
        else:
 
144
            f.write("deleted mode %o\n" % old_mode)
 
145
    f.write("index %s..%s" % (shortid(old_id), shortid(new_id)))
 
146
    if new_mode is not None:
 
147
        f.write(" %o" % new_mode)
 
148
    f.write("\n")
 
149
    old_contents = lines(old_mode, old_id)
 
150
    new_contents = lines(new_mode, new_id)
 
151
    f.writelines(unified_diff(old_contents, new_contents,
 
152
        old_path, new_path))
 
153
 
 
154
 
106
155
def write_blob_diff(f, (old_path, old_mode, old_blob),
107
156
                       (new_path, new_mode, new_blob)):
108
157
    """Write diff file header.
110
159
    :param f: File-like object to write to
111
160
    :param (old_path, old_mode, old_blob): Previous file (None if nonexisting)
112
161
    :param (new_path, new_mode, new_blob): New file (None if nonexisting)
 
162
 
 
163
    :note: The use of write_object_diff is recommended over this function.
113
164
    """
114
165
    def blob_id(blob):
115
166
        if blob is None:
156
207
    """
157
208
    changes = store.tree_changes(old_tree, new_tree)
158
209
    for (oldpath, newpath), (oldmode, newmode), (oldsha, newsha) in changes:
159
 
        if oldsha is None:
160
 
            old_blob = Blob.from_string("")
161
 
        else:
162
 
            old_blob = store[oldsha]
163
 
        if newsha is None:
164
 
            new_blob = Blob.from_string("")
165
 
        else:
166
 
            new_blob = store[newsha]
167
 
        write_blob_diff(f, (oldpath, oldmode, old_blob),
168
 
                           (newpath, newmode, new_blob))
 
210
        write_object_diff(f, store, (oldpath, oldmode, oldsha),
 
211
                                    (newpath, newmode, newsha))
169
212
 
170
213
 
171
214
def git_am_patch_split(f):