Rev 4: Very basic SettingRecorder which can save the default target branch in http://bzr.arbash-meinel.com/branches/bzr/merge_into

John Arbash Meinel john at arbash-meinel.com
Fri Dec 21 21:28:40 GMT 2007


At http://bzr.arbash-meinel.com/branches/bzr/merge_into

------------------------------------------------------------
revno: 4
revision-id:john at arbash-meinel.com-20071221212834-qjjsrrb2c0zv8ado
parent: john at arbash-meinel.com-20071221205426-rt82hrvdevdp85ph
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: merge_into
timestamp: Fri 2007-12-21 15:28:34 -0600
message:
  Very basic SettingRecorder which can save the default target branch
modified:
  bzr_merge_into.py              bzr_merge_into.py-20071221192513-1fyh868lls6qugcq-1
  bzr_merge_into.wxg             bzr_merge_into.wxg-20071221185509-khngkqvqe1jjzb2i-1
-------------- next part --------------
=== modified file 'bzr_merge_into.py'
--- a/bzr_merge_into.py	2007-12-21 20:54:26 +0000
+++ b/bzr_merge_into.py	2007-12-21 21:28:34 +0000
@@ -20,6 +20,7 @@
 
 import errno
 import os
+import re
 import subprocess
 import sys
 import time
@@ -91,6 +92,11 @@
             # We want to poll, but we also want to grab sys.stdout and
             # sys.stderr, how do we do that?
             while p.poll() is None and not self.canceled:
+                # TODO: Rather than spinning here without showing the user
+                # anything, we would really like to create a fake terminal, and
+                # have it show the output from the child command.
+                # We basically need to poll p.stdout and p.stderr, and write
+                # them to a text control.
                 self.gauge_progress.Pulse()
                 wx.Yield()
                 time.sleep(0.1)
@@ -134,7 +140,7 @@
         self.text_merge_patch = wx.TextCtrl(self, -1, "")
         self.label_2 = wx.StaticText(self, -1, "Target Branch")
         self.btn_browse_branch = wx.Button(self, -1, "Browse")
-        self.text_target_branch = wx.TextCtrl(self, -1, "/home/jameinel/dev/bzr/jam-integration")
+        self.text_target_branch = wx.TextCtrl(self, -1, "")
         self.radio_pull_overwrite = wx.RadioButton(self, -1, "pull --overwrite", style=wx.RB_GROUP)
         self.radio_merge = wx.RadioButton(self, -1, "merge")
         self.button_1 = wx.Button(self, wx.ID_CANCEL, "")
@@ -206,9 +212,13 @@
             self.text_target_branch.SetValue(dlg.GetPath())
 
     def onCancel(self, event): # wxGlade: MergeIntoFrame.<event_handler>
+        global canceled
+        canceled = True
         self.Close()
 
     def onOk(self, event): # wxGlade: MergeIntoFrame.<event_handler>
+        global canceled
+        canceled = True
         patch = self.text_merge_patch.GetValue()
         if not patch:
             dlg = wx.MessageDialog(self,
@@ -256,27 +266,98 @@
             err_dlg.ShowModal()
         else:
             # We are done here
+            canceled = False
+            app.setting_recorder.update('target_branch',
+                self.text_target_branch.GetValue())
             self.Close()
 
 # end of class MergeIntoFrame
 
+class SettingRecorder(object):
+    """Just a *very* simple class that tracks a couple basic settings."""
+
+    setting_re = re.compile('^(?P<key>\S+)\s*=\s*(?P<value>.*)$')
+
+    def __init__(self, filename):
+        self.filename = filename
+        self.lines = []
+        self.settings = {}
+        # Map from setting to the line it was found on
+        self.setting_line = {}
+
+    def parse(self):
+        # Process the settings file
+        try:
+            f = open(self.filename, 'rb')
+        except IOError, e:
+            if e.errno in (errno.ENOENT,):
+                self.lines = []
+                return
+            else:
+                raise
+        try:
+            self.lines = f.readlines()
+        finally:
+            f.close()
+        for idx, line in enumerate(self.lines):
+            if line.startswith('#'):
+                continue
+            m = self.setting_re.match(line)
+            if m:
+                self.settings[m.group('key')] = m.group('value')
+                self.setting_line[m.group('key')] = idx
+
+    def get(self, key):
+        return self.settings.get(key, None)
+
+    def update(self, key, value):
+        """Change a setting to something new."""
+        self.settings[key] = value
+        new_line = '%s = %s\n' % (key, value)
+        idx = self.setting_line.get(key, None)
+        if idx is not None:
+            self.lines[idx] = new_line
+        else:
+            self.setting_line[key] = len(self.lines)
+            self.lines.append(new_line)
+
+    def write(self):
+        f = open(self.filename, 'wb')
+        try:
+            f.writelines(self.lines)
+        finally:
+            f.close()
+
 
 class MergeIntoApp(wx.App):
     def OnInit(self):
         wx.InitAllImageHandlers()
         merge_into = MergeIntoFrame(None, -1, "")
         self.SetTopWindow(merge_into)
+        self.setting_recorder = SettingRecorder(
+            os.path.expanduser('~/.bzr_merge_into_guirc'))
+        self.setting_recorder.parse()
         if len(sys.argv) > 1:
             patch = sys.argv[1]
             merge_into.text_merge_patch.SetValue(patch)
+        target = None
         if len(sys.argv) > 2:
             target = sys.argv[2]
+        else:
+            target = self.setting_recorder.get('target_branch')
+        if target is not None:
             merge_into.text_target_branch.SetValue(target)
         merge_into.Show()
+        self.merge_into = merge_into
         return 1
 
 # end of class MergeIntoApp
 
+canceled = True
+
 if __name__ == "__main__":
     app = MergeIntoApp(0)
     app.MainLoop()
+    merge_into = app.merge_into
+    if not canceled:
+        app.setting_recorder.write()

=== modified file 'bzr_merge_into.wxg'
--- a/bzr_merge_into.wxg	2007-12-21 20:54:26 +0000
+++ b/bzr_merge_into.wxg	2007-12-21 21:28:34 +0000
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!-- generated by wxGlade 0.5 on Fri Dec 21 14:44:03 2007 -->
+<!-- generated by wxGlade 0.5 on Fri Dec 21 15:26:55 2007 -->
 
 <application path="bzr_merge_into.py" name="" class="MergeIntoApp" option="0" language="python" top_window="merge_into" encoding="UTF-8" use_gettext="0" overwrite="0" use_new_namespace="1" for_version="2.8" is_template="0">
     <object class="MergeIntoFrame" name="merge_into" base="EditFrame">



More information about the bazaar-commits mailing list