~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to shelf.py

Merge from Aaron.

Show diffs side-by-side

added added

removed removed

Lines of Context:
11
11
from bzrlib import DEFAULT_IGNORE
12
12
from hunk_selector import HunkSelector
13
13
from diffstat import DiffStat
 
14
from subprocess import Popen, PIPE
14
15
 
15
16
DEFAULT_IGNORE.append('./.bzr-shelf*')
16
17
 
75
76
            print >>sys.stderr, ' "%s"' % message
76
77
        else:
77
78
            print >>sys.stderr, ""
78
 
        pipe = os.popen('patch -d %s -s -p0' % self.branch.base, 'w')
79
 
        pipe.write(patch)
80
 
        pipe.flush()
81
 
 
82
 
        if pipe.close() is not None:
83
 
            raise Exception("Failed running patch!")
84
 
 
 
79
        run_patch(self.branch.base, (patch,))
85
80
        os.remove(shelf)
86
81
 
87
82
        diff_stat = DiffStat(self.get_patches(None, None))
88
83
        print 'Diff status is now:\n', diff_stat
89
84
 
90
 
        return True
 
85
        return 1
91
86
 
92
87
    def get_patches(self, revision, file_list):
93
88
        from StringIO import StringIO
109
104
 
110
105
        if len(patches) == 0:
111
106
            print >>sys.stderr, 'Nothing to shelve'
112
 
            return True
 
107
            return 0
113
108
 
114
109
        shelf = self.next_shelf()
115
110
        print >>sys.stderr, "Saving shelved patches to", shelf
125
120
        shelf.close()
126
121
 
127
122
        print >>sys.stderr, "Reverting shelved patches"
128
 
        pipe = os.popen('patch -d %s -sR -p0' % self.branch.base, 'w')
129
 
        for patch in patches:
130
 
            pipe.write(str(patch))
131
 
        pipe.flush()
132
 
 
133
 
        if pipe.close() is not None:
134
 
            raise Exception("Failed running patch!")
 
123
        run_patch(self.branch.base, patches, reverse=True)
135
124
 
136
125
        diff_stat = DiffStat(self.get_patches(None, None))
137
126
        print 'Diff status is now:\n', diff_stat
138
127
 
139
 
        return True
 
128
        return 1
140
129
 
 
130
def run_patch(branch_base, patches, reverse=False):
 
131
    args = ['patch', '-d', branch_base, '-s', '-p0', '-f']
 
132
    if reverse:
 
133
        args.append('-R')
 
134
    process = Popen(args, stdin=PIPE)
 
135
    for patch in patches:
 
136
        process.stdin.write(str(patch))
 
137
    process.stdin.close()
 
138
    result = process.wait()
 
139
    if result not in (0, 1):
 
140
        raise Exception("Error applying patches")
 
141
    return result