# HG changeset patch
# User erosa <goaway1...@gmail.com>
# Date 1247430071 14400
# Node ID 6fac56c1f654e4f8ecc244564410a59c623ecca1
# Parent  f7e45cdf3f0c6b04f70732c74e4c2ddbb0c8710b
add ability to archive selected revision

hggtk: add archive command and archive dialog box
history: add archive command to context menu

diff -r f7e45cdf3f0c -r 6fac56c1f654 hggtk/archive.py
--- /dev/null    Thu Jan 01 00:00:00 1970 +0000
+++ b/hggtk/archive.py    Sun Jul 12 16:21:11 2009 -0400
@@ -0,0 +1,209 @@
+#
+# archive.py - TortoiseHg's dialog for archiving a repo revision
+#
+# Copyright (C) 2007 TK Soh <teekay...@gmail.com>
+#
+
+import os
+import gtk
+import gobject
+import pango
+
+from mercurial import hg, ui
+
+from thgutil.i18n import _
+from thgutil import hglib, paths
+
+from hggtk import hgcmd, gtklib
+
+_working_dir_parent_ = _('= Working Directory Parent =')
+
+class ArchiveDialog(gtk.Window):
+    """ Dialog to archive a Mercurial repo """
+    def __init__(self, rev=None):
+        """ Initialize the Dialog """
+        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
+        gtklib.set_tortoise_icon(self, 'menucheckout.ico')
+        gtklib.set_tortoise_keys(self)
+
+        self.set_default_size(550, 120)
+        self.notify_func = None
+
+        try:
+            repo = hg.repository(ui.ui(), path=paths.find_root())
+        except hglib.RepoError:
+            gobject.idle_add(self.destroy)
+            return
+
+        title = _('Archive - %s') %
hglib.toutf(os.path.basename(repo.root))
+        self.set_title(title)
+
+        vbox = gtk.VBox()
+        self.add(vbox)
+
+        hbox = gtk.HBox()
+        lbl = gtk.Label(_('Archive revision:'))
+        hbox.pack_start(lbl, False, False, 2)
+
+        # revisions editable combo box
+        combo = gtk.combo_box_entry_new_text()
+        hbox.pack_start(combo, True, True, 2)
+        vbox.pack_start(hbox, False, False, 10)
+        if rev:
+            combo.append_text(str(rev))
+        else:
+            combo.append_text(_working_dir_parent_)
+        combo.set_active(0)
+        for b in repo.branchtags():
+            combo.append_text(b)
+        tags = list(repo.tags())
+        tags.sort()
+        tags.reverse()
+        for t in tags:
+            combo.append_text(t)
+
+        vbox.add(self.get_destination_container(self.get_default_path()))
+        vbox.add(self.get_type_container())
+
+        hbbox = gtk.HButtonBox()
+        hbbox.set_layout(gtk.BUTTONBOX_END)
+        vbox.pack_start(hbbox, False, False, 2)
+        close = gtk.Button(_('Close'))
+        close.connect('clicked', lambda x: self.destroy())
+
+        accelgroup = gtk.AccelGroup()
+        self.add_accel_group(accelgroup)
+        key, modifier = gtk.accelerator_parse('Escape')
+        close.add_accelerator('clicked', accelgroup, key, 0,
+                gtk.ACCEL_VISIBLE)
+        hbbox.add(close)
+
+        archive = gtk.Button(_('Archive'))
+        archive.connect('clicked', self.archive, combo, repo)
+        mod = gtklib.get_thg_modifier()
+        key, modifier = gtk.accelerator_parse(mod+'Return')
+        archive.add_accelerator('clicked', accelgroup, key, modifier,
+                gtk.ACCEL_VISIBLE)
+        hbbox.add(archive)
+        archive.grab_focus()
+
+        entry = combo.child
+        entry.connect('activate', self.entry_activated, archive, combo,
repo)
+
+    def get_type_container(self):
+        """Return a frame containing the supported archive types"""
+        frame = gtk.Frame(_('Archive type'))
+        vbox = gtk.VBox()
+
+        self.filesradio = gtk.RadioButton(None, _('Directory of files'))
+        self.tarradio = gtk.RadioButton(self.filesradio,
_('Uncompressed tar archive'))
+        self.tbz2radio = gtk.RadioButton(self.filesradio, _('Tar
archive compressed using bzip2'))
+        self.tgzradio = gtk.RadioButton(self.filesradio, _('Tar archive
compressed using gzip'))
+        self.uzipradio = gtk.RadioButton(self.filesradio,
_('Uncompressed zip archive'))
+        self.zipradio = gtk.RadioButton(self.filesradio, _('Zip archive
compressed using deflate'))
+
+        vbox.pack_start(self.filesradio, True, True, 2)
+        vbox.pack_start(self.tarradio, True, True, 2)
+        vbox.pack_start(self.tbz2radio, True, True, 2)
+        vbox.pack_start(self.tgzradio, True, True, 2)
+        vbox.pack_start(self.uzipradio, True, True, 2)
+        vbox.pack_start(self.zipradio, True, True, 2)
+        frame.add(vbox)
+        frame.set_border_width(2)
+        return frame
+
+    def get_destination_container(self, default_path):
+        """Return an hbox containing the widgets for the destination
path"""
+        hbox = gtk.HBox()
+        lbl = gtk.Label(_('Destination Path:'))
+
+        # create drop-down list for source paths
+        self.destlist = gtk.ListStore(str)
+        destcombo = gtk.ComboBoxEntry(self.destlist, 0)
+        self.destentry = destcombo.get_child()
+        self.destentry.set_text(default_path)
+        self.destentry.set_position(-1)
+
+        # replace the drop-down widget so we can modify it's properties
+        destcombo.clear()
+        cell = gtk.CellRendererText()
+        cell.set_property('ellipsize', pango.ELLIPSIZE_MIDDLE)
+        destcombo.pack_start(cell)
+        destcombo.add_attribute(cell, 'text', 0)
+
+        destbrowse = gtk.Button(_('Browse...'))
+        destbrowse.connect('clicked', self.browse_clicked)
+        hbox.pack_start(lbl, False, False)
+        hbox.pack_start(destcombo, True, True, 2)
+        hbox.pack_end(destbrowse, False, False, 5)
+        return hbox
+
+    def get_default_path(self):
+        """Return the default destination path"""
+        return hglib.toutf(os.getcwd())
+
+    def get_save_file_dialog(self, filter):
+        """Return a configured save file dialog"""
+        return gtklib.NativeSaveFileDialogWrapper(
+            InitialDir=self.destentry.get_text(),
+            Title=_('Select Destination File'),
+            Filter=filter)
+
+    def get_selected_archive_type(self):
+        """Return a dictionary describing the selected archive type"""
+        dict = {}
+        if self.tarradio.get_active():
+            dict['type'] = 'tar'
+            dict['filter'] = ((_('Tar archives'), '*.tar'),)
+        elif self.tbz2radio.get_active():
+            dict['type'] = 'tbz2'
+            dict['filter'] = ((_('Bzip2 tar archives'), '*.tbz2'),)
+        elif self.tgzradio.get_active():
+            dict['type'] = 'tgz'
+            dict['filter'] = ((_('Gzip tar archives'), '*.tgz'),)
+        elif self.uzipradio.get_active():
+            dict['type'] = 'uzip'
+            dict['filter'] = ((_('Uncompressed zip archives'), '*.uzip'),)
+        elif self.zipradio.get_active():
+            dict['type'] = 'zip'
+            dict['filter'] = ((_('Compressed zip archives'), '*.zip'),)
+        else:
+            dict['type'] = 'files'
+
+        return dict
+
+    def entry_activated(self, entry, button, combo, repo):
+        self.update(button, combo, repo)
+
+    def browse_clicked(self, button):
+        """Select the destination directory or file"""
+        archive_type = self.get_selected_archive_type()
+        if archive_type['type'] == 'files':
+            response = gtklib.NativeFolderSelectDialog(
+                          initial=self.destentry.get_text(),
+                          title=_('Select Destination Folder')).run()
+        else:
+            filter = archive_type['filter']
+            response = self.get_save_file_dialog(filter).run()
+
+        if response:
+            self.destentry.set_text(response)
+
+    def archive(self, button, combo, repo):
+        rev = combo.get_active_text()
+
+        cmdline = ['hg', 'archive', '--verbose']
+        if rev != _working_dir_parent_:
+            cmdline.append('--rev')
+            cmdline.append(rev)
+
+        cmdline.append('-t')
+        cmdline.append(self.get_selected_archive_type()['type'])
+        cmdline.append(self.destentry.get_text())
+
+        dlg = hgcmd.CmdDialog(cmdline)
+        dlg.run()
+        dlg.hide()
+
+def run(ui, *pats, **opts):
+    return ArchiveDialog(opts.get('rev'))
diff -r f7e45cdf3f0c -r 6fac56c1f654 hggtk/hgtk.py
--- a/hggtk/hgtk.py    Sun Jul 12 10:06:16 2009 -0500
+++ b/hggtk/hgtk.py    Sun Jul 12 16:21:11 2009 -0400
@@ -611,6 +611,11 @@
         cmdlist = [' '.join(c[0]) for c in cmdlist.values()]
     ui.write("%s\n" % "\n".join(sorted(cmdlist)))
 
+def archive(ui, *pats, **opts):
+    """create an unversioned archive of a repository revision"""
+    from hggtk.archive import run
+    gtkrun(run, ui, *pats, **opts)
+
 globalopts = [
     ('R', 'repository', '',
      _('repository root directory or symbolic path name')),
@@ -676,4 +681,7 @@
          [('o', 'options', None, _('show the command options'))],
          _('[-o] CMD')),
     "help": (help_, [], _('hgtk help [COMMAND]')),
+    "^archive": (archive,
+        [('r', 'rev', '', _('revision to update'))],
+        ('hgtk archive')),
 }
diff -r f7e45cdf3f0c -r 6fac56c1f654 hggtk/history.py
--- a/hggtk/history.py    Sun Jul 12 10:06:16 2009 -0500
+++ b/hggtk/history.py    Sun Jul 12 16:21:11 2009 -0400
@@ -20,7 +20,7 @@
 from hggtk.logview.treeview import TreeView as LogTreeView
 
 from hggtk import gdialog, gtklib, hgcmd, datamine, logfilter
-from hggtk import backout, status, hgemail, tagadd, update, merge
+from hggtk import backout, status, hgemail, tagadd, update, merge, archive
 from hggtk import changeset
 
 def create_menu(label, callback):
@@ -400,6 +400,7 @@
         m.append(create_menu(_('add/remove _tag'), self.add_tag))
         m.append(create_menu(_('backout revision'), self.backout_rev))
         m.append(create_menu(_('_revert'), self.revert))
+        m.append(create_menu(_('_archive'), self.archive))
 
         # need mq extension for strip command
         extensions.loadall(self.ui)
@@ -755,6 +756,15 @@
         elif not oldparents == newparents:
             self.refresh_model()
 
+    def archive(self, menuitem):
+        rev = self.currow[treemodel.REVID]
+        parents = [x.node() for x in self.repo.parents()]
+        dialog = archive.ArchiveDialog(rev)
+        dialog.set_transient_for(self)
+        dialog.show_all()
+        dialog.present()
+        dialog.set_transient_for(None)
+
     def selection_changed(self, treeview):
         self.currow = self.graphview.get_revision()
         rev = self.currow[treemodel.REVID]

# HG changeset patch
# User Emmanuel Rosa <goaway1...@gmail.com>
# Date 1247430071 14400
# Node ID 6fac56c1f654e4f8ecc244564410a59c623ecca1
# Parent  f7e45cdf3f0c6b04f70732c74e4c2ddbb0c8710b
add ability to archive selected revision

hggtk: add archive command and archive dialog box
history: add archive command to context menu

diff -r f7e45cdf3f0c -r 6fac56c1f654 hggtk/archive.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/hggtk/archive.py  Sun Jul 12 16:21:11 2009 -0400
@@ -0,0 +1,209 @@
+#
+# archive.py - TortoiseHg's dialog for archiving a repo revision
+#
+# Copyright (C) 2007 TK Soh <teekay...@gmail.com>
+#
+
+import os
+import gtk
+import gobject
+import pango
+
+from mercurial import hg, ui
+
+from thgutil.i18n import _
+from thgutil import hglib, paths
+
+from hggtk import hgcmd, gtklib
+
+_working_dir_parent_ = _('= Working Directory Parent =')
+
+class ArchiveDialog(gtk.Window):
+    """ Dialog to archive a Mercurial repo """
+    def __init__(self, rev=None):
+        """ Initialize the Dialog """
+        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
+        gtklib.set_tortoise_icon(self, 'menucheckout.ico')
+        gtklib.set_tortoise_keys(self)
+
+        self.set_default_size(550, 120)
+        self.notify_func = None
+
+        try:
+            repo = hg.repository(ui.ui(), path=paths.find_root())
+        except hglib.RepoError:
+            gobject.idle_add(self.destroy)
+            return
+
+        title = _('Archive - %s') % hglib.toutf(os.path.basename(repo.root))
+        self.set_title(title)
+
+        vbox = gtk.VBox()
+        self.add(vbox)
+
+        hbox = gtk.HBox()
+        lbl = gtk.Label(_('Archive revision:'))
+        hbox.pack_start(lbl, False, False, 2)
+
+        # revisions editable combo box
+        combo = gtk.combo_box_entry_new_text()
+        hbox.pack_start(combo, True, True, 2)
+        vbox.pack_start(hbox, False, False, 10)
+        if rev:
+            combo.append_text(str(rev))
+        else:
+            combo.append_text(_working_dir_parent_)
+        combo.set_active(0)
+        for b in repo.branchtags():
+            combo.append_text(b)
+        tags = list(repo.tags())
+        tags.sort()
+        tags.reverse()
+        for t in tags:
+            combo.append_text(t)
+
+        vbox.add(self.get_destination_container(self.get_default_path()))
+        vbox.add(self.get_type_container())
+
+        hbbox = gtk.HButtonBox()
+        hbbox.set_layout(gtk.BUTTONBOX_END)
+        vbox.pack_start(hbbox, False, False, 2)
+        close = gtk.Button(_('Close'))
+        close.connect('clicked', lambda x: self.destroy())
+
+        accelgroup = gtk.AccelGroup()
+        self.add_accel_group(accelgroup)
+        key, modifier = gtk.accelerator_parse('Escape')
+        close.add_accelerator('clicked', accelgroup, key, 0,
+                gtk.ACCEL_VISIBLE)
+        hbbox.add(close)
+
+        archive = gtk.Button(_('Archive'))
+        archive.connect('clicked', self.archive, combo, repo)
+        mod = gtklib.get_thg_modifier()
+        key, modifier = gtk.accelerator_parse(mod+'Return')
+        archive.add_accelerator('clicked', accelgroup, key, modifier,
+                gtk.ACCEL_VISIBLE)
+        hbbox.add(archive)
+        archive.grab_focus()
+
+        entry = combo.child
+        entry.connect('activate', self.entry_activated, archive, combo, repo)
+
+    def get_type_container(self):
+        """Return a frame containing the supported archive types"""
+        frame = gtk.Frame(_('Archive type'))
+        vbox = gtk.VBox()
+
+        self.filesradio = gtk.RadioButton(None, _('Directory of files'))
+        self.tarradio = gtk.RadioButton(self.filesradio, _('Uncompressed tar 
archive'))
+        self.tbz2radio = gtk.RadioButton(self.filesradio, _('Tar archive 
compressed using bzip2'))
+        self.tgzradio = gtk.RadioButton(self.filesradio, _('Tar archive 
compressed using gzip'))
+        self.uzipradio = gtk.RadioButton(self.filesradio, _('Uncompressed zip 
archive'))
+        self.zipradio = gtk.RadioButton(self.filesradio, _('Zip archive 
compressed using deflate'))
+
+        vbox.pack_start(self.filesradio, True, True, 2)
+        vbox.pack_start(self.tarradio, True, True, 2)
+        vbox.pack_start(self.tbz2radio, True, True, 2)
+        vbox.pack_start(self.tgzradio, True, True, 2)
+        vbox.pack_start(self.uzipradio, True, True, 2)
+        vbox.pack_start(self.zipradio, True, True, 2)
+        frame.add(vbox)
+        frame.set_border_width(2)
+        return frame
+
+    def get_destination_container(self, default_path):
+        """Return an hbox containing the widgets for the destination path"""
+        hbox = gtk.HBox()
+        lbl = gtk.Label(_('Destination Path:'))
+
+        # create drop-down list for source paths
+        self.destlist = gtk.ListStore(str)
+        destcombo = gtk.ComboBoxEntry(self.destlist, 0)
+        self.destentry = destcombo.get_child()
+        self.destentry.set_text(default_path)
+        self.destentry.set_position(-1)
+
+        # replace the drop-down widget so we can modify it's properties
+        destcombo.clear()
+        cell = gtk.CellRendererText()
+        cell.set_property('ellipsize', pango.ELLIPSIZE_MIDDLE)
+        destcombo.pack_start(cell)
+        destcombo.add_attribute(cell, 'text', 0)
+
+        destbrowse = gtk.Button(_('Browse...'))
+        destbrowse.connect('clicked', self.browse_clicked)
+        hbox.pack_start(lbl, False, False)
+        hbox.pack_start(destcombo, True, True, 2)
+        hbox.pack_end(destbrowse, False, False, 5)
+        return hbox
+
+    def get_default_path(self):
+        """Return the default destination path"""
+        return hglib.toutf(os.getcwd())
+
+    def get_save_file_dialog(self, filter):
+        """Return a configured save file dialog"""
+        return gtklib.NativeSaveFileDialogWrapper(
+            InitialDir=self.destentry.get_text(), 
+            Title=_('Select Destination File'),
+            Filter=filter)
+
+    def get_selected_archive_type(self):
+        """Return a dictionary describing the selected archive type"""
+        dict = {}
+        if self.tarradio.get_active():
+            dict['type'] = 'tar'
+            dict['filter'] = ((_('Tar archives'), '*.tar'),)
+        elif self.tbz2radio.get_active():
+            dict['type'] = 'tbz2'
+            dict['filter'] = ((_('Bzip2 tar archives'), '*.tbz2'),)
+        elif self.tgzradio.get_active():
+            dict['type'] = 'tgz'
+            dict['filter'] = ((_('Gzip tar archives'), '*.tgz'),)
+        elif self.uzipradio.get_active():
+            dict['type'] = 'uzip'
+            dict['filter'] = ((_('Uncompressed zip archives'), '*.uzip'),)
+        elif self.zipradio.get_active():
+            dict['type'] = 'zip'
+            dict['filter'] = ((_('Compressed zip archives'), '*.zip'),)
+        else:
+            dict['type'] = 'files'
+
+        return dict
+
+    def entry_activated(self, entry, button, combo, repo):
+        self.update(button, combo, repo)
+
+    def browse_clicked(self, button):
+        """Select the destination directory or file"""
+        archive_type = self.get_selected_archive_type()
+        if archive_type['type'] == 'files':
+            response = gtklib.NativeFolderSelectDialog(
+                          initial=self.destentry.get_text(),
+                          title=_('Select Destination Folder')).run()
+        else:
+            filter = archive_type['filter']
+            response = self.get_save_file_dialog(filter).run()
+
+        if response:
+            self.destentry.set_text(response)
+
+    def archive(self, button, combo, repo):
+        rev = combo.get_active_text()
+
+        cmdline = ['hg', 'archive', '--verbose']
+        if rev != _working_dir_parent_:
+            cmdline.append('--rev')
+            cmdline.append(rev)
+
+        cmdline.append('-t')
+        cmdline.append(self.get_selected_archive_type()['type'])
+        cmdline.append(self.destentry.get_text())
+
+        dlg = hgcmd.CmdDialog(cmdline)
+        dlg.run()
+        dlg.hide()
+
+def run(ui, *pats, **opts):
+    return ArchiveDialog(opts.get('rev'))
diff -r f7e45cdf3f0c -r 6fac56c1f654 hggtk/hgtk.py
--- a/hggtk/hgtk.py     Sun Jul 12 10:06:16 2009 -0500
+++ b/hggtk/hgtk.py     Sun Jul 12 16:21:11 2009 -0400
@@ -611,6 +611,11 @@
         cmdlist = [' '.join(c[0]) for c in cmdlist.values()]
     ui.write("%s\n" % "\n".join(sorted(cmdlist)))
 
+def archive(ui, *pats, **opts):
+    """create an unversioned archive of a repository revision"""
+    from hggtk.archive import run
+    gtkrun(run, ui, *pats, **opts)
+
 globalopts = [
     ('R', 'repository', '',
      _('repository root directory or symbolic path name')),
@@ -676,4 +681,7 @@
          [('o', 'options', None, _('show the command options'))],
          _('[-o] CMD')),
     "help": (help_, [], _('hgtk help [COMMAND]')),
+    "^archive": (archive,
+        [('r', 'rev', '', _('revision to update'))],
+        ('hgtk archive')),
 }
diff -r f7e45cdf3f0c -r 6fac56c1f654 hggtk/history.py
--- a/hggtk/history.py  Sun Jul 12 10:06:16 2009 -0500
+++ b/hggtk/history.py  Sun Jul 12 16:21:11 2009 -0400
@@ -20,7 +20,7 @@
 from hggtk.logview.treeview import TreeView as LogTreeView
 
 from hggtk import gdialog, gtklib, hgcmd, datamine, logfilter
-from hggtk import backout, status, hgemail, tagadd, update, merge
+from hggtk import backout, status, hgemail, tagadd, update, merge, archive
 from hggtk import changeset
 
 def create_menu(label, callback):
@@ -400,6 +400,7 @@
         m.append(create_menu(_('add/remove _tag'), self.add_tag))
         m.append(create_menu(_('backout revision'), self.backout_rev))
         m.append(create_menu(_('_revert'), self.revert))
+        m.append(create_menu(_('_archive'), self.archive))
 
         # need mq extension for strip command
         extensions.loadall(self.ui)
@@ -755,6 +756,15 @@
         elif not oldparents == newparents:
             self.refresh_model()
 
+    def archive(self, menuitem):
+        rev = self.currow[treemodel.REVID]
+        parents = [x.node() for x in self.repo.parents()]
+        dialog = archive.ArchiveDialog(rev)
+        dialog.set_transient_for(self)
+        dialog.show_all()
+        dialog.present()
+        dialog.set_transient_for(None)
+
     def selection_changed(self, treeview):
         self.currow = self.graphview.get_revision()
         rev = self.currow[treemodel.REVID]
------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Tortoisehg-develop mailing list
Tortoisehg-develop@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tortoisehg-develop

Reply via email to