Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 2.1, 2.1.1, and 2.1.2

rupdate - Add dialog for Remote Update.

Requires rupdate: http://bitbucket.org/MrWerewolf/rupdate

Remote Update is adds the ability to update a remote repository to a
specified revision if the remote repository is accessed through ssh.

Note: The default TortoisePlink.exe will give you a "Not enough storage is
available to process this command" error when you try to run this. To get around
this, use another version of plink. I use a copy of the TortoisePlink.exe from
TortoiseCVS.

Changeset 65177156186d

Parent eea6d46db008

by Ryan Seto

Changes to 4 files · Browse files at 65177156186d Showing diff from parent eea6d46db008 Diff from another changeset...

 
1010
1011
1012
 
 
 
1013
1014
1015
 
1252
1253
1254
 
 
 
 
1255
1256
1257
 
1010
1011
1012
1013
1014
1015
1016
1017
1018
 
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
@@ -1010,6 +1010,9 @@
  entry(menu, 'reviewboard', fixed, _('Post to Review Board...'), 'reviewboard',   self.sendToReviewBoard)   + entry(menu, 'rupdate', fixed, _('Remote Update...'), 'hg-update', + self.rupdate) +   self.singlecmenu = menu   self.singlecmenuitems = items   @@ -1252,6 +1255,10 @@
  run.postreview(self.repo.ui, rev=self.repoview.selectedRevisions(),   repo=self.repo)   + def rupdate(self): + run.rupdate(self.repo.ui, rev=self.rev, + repo=self.repo) +   def emailRevision(self):   run.email(self.repo.ui, rev=self.repoview.selectedRevisions(),   repo=self.repo)
 
565
566
567
 
 
 
 
 
568
569
570
 
565
566
567
568
569
570
571
572
573
574
575
@@ -565,6 +565,11 @@
  from tortoisehg.hgqt.postreview import run   return qtrun(run, ui, *pats, **opts)   +def rupdate(ui, *pats, **opts): + """update a remote repository""" + from tortoisehg.hgqt.rupdate import run + return qtrun(run, ui, *pats, **opts) +  def merge(ui, *pats, **opts):   """merge wizard"""   from tortoisehg.hgqt.merge import run
Change 1 of 1 Show Entire File tortoisehg/​hgqt/​rupdate.py Stacked
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
@@ -0,0 +1,132 @@
+# Copyright 2011 Ryan Seto <mr.werewolf@gmail.com> +# +# rupdate.py - Remote Update dialog for TortoiseHg +# +# This dialog lets users update a remote ssh repository. +# +# Requires a copy of the rupdate plugin found at: +# http://bitbucket.org/MrWerewolf/rupdate +# +# Also, enable the plugin with the following in mercurial.ini: +# +# [extensions] +# rupdate = /path/to/rupdate +# +# +# This software may be used and distributed according to the terms of the +# GNU General Public License version 2, incorporated herein by reference. + +from PyQt4.QtCore import * +from PyQt4.QtGui import * + +from mercurial import error, node, merge as mergemod + +from tortoisehg.util import hglib, paths +from tortoisehg.hgqt.i18n import _ +from tortoisehg.hgqt import cmdui, csinfo, qtlib, thgrepo, resolve +from tortoisehg.hgqt.update import UpdateDialog + +class rUpdateDialog(UpdateDialog): + + def __init__(self, repo, rev=None, parent=None, opts={}): + super(rUpdateDialog, self).__init__(repo, rev, parent, opts) + + # Get configured paths + self.paths = {} + fn = self.repo.join('hgrc') + fn, cfg = qtlib.loadIniFile([fn], self) + if 'paths' in cfg: + for alias in cfg['paths']: + self.paths[ alias ] = cfg['paths'][alias] + + ### target path combo + self.path_combo = pcombo = QComboBox() + pcombo.setEditable(True) + + for alias in self.paths: + pcombo.addItem(hglib.tounicode(self.paths[alias])) + + ### shift existing items down a row. + for i in range(self.grid.count()-1, -1, -1): + row, col, rowSp, colSp = self.grid.getItemPosition(i) + item = self.grid.takeAt(i) + self.grid.removeItem(item) + self.grid.addItem(item, row + 1, col, rowSp, colSp, item.alignment()) + + ### add target path combo to grid + self.grid.addWidget(QLabel(_('Location:')), 0, 0) + self.grid.addWidget(pcombo, 0, 1) + + ### Options + self.push_chk = QCheckBox(_('Perform a push before updating' + ' (-p/--push)')) + self.newbranch_chk = QCheckBox(_('Allow pushing new branches' + ' (--new-branch)')) + self.force_chk = QCheckBox(_('Force push to remote location' + ' (-f/--force)')) + self.optbox.removeWidget(self.showlog_chk) + self.optbox.addWidget(self.push_chk) + self.optbox.addWidget(self.newbranch_chk) + self.optbox.addWidget(self.force_chk) + self.optbox.addWidget(self.showlog_chk) + + # prepare to show + self.push_chk.setHidden(True) + self.newbranch_chk.setHidden(True) + self.force_chk.setHidden(True) + self.update_info() + + ### Private Methods ### + + def update_info(self): + super(rUpdateDialog, self).update_info() + + # Keep update button enabled. + self.update_btn.setDisabled(False) + + def update(self): + cmdline = ['rupdate'] + + if self.discard_chk.isChecked(): + cmdline.append('--clean') + if self.push_chk.isChecked(): + cmdline.append('--push') + if self.newbranch_chk.isChecked(): + cmdline.append('--new-branch') + if self.force_chk.isChecked(): + cmdline.append('--force') + + dest = hglib.fromunicode(self.path_combo.currentText()) + cmdline.append('-d') + cmdline.append(dest) + + # Refer to the revision by the short hash. + rev = hglib.fromunicode(self.rev_combo.currentText()) + revShortHash = node.short(self.repo[rev].node()) + cmdline.append(revShortHash) + + # start updating + self.repo.incrementBusyCount() + self.cmd.run(cmdline) + + ### Signal Handlers ### + + def show_options(self, visible): + self.push_chk.setShown(visible) + self.newbranch_chk.setShown(visible) + self.force_chk.setShown(visible) + self.showlog_chk.setShown(visible) + + def command_started(self): + super(rUpdateDialog, self).command_started() + self.update_btn.setHidden(False) + +def run(ui, *pats, **opts): + from tortoisehg.util import paths + repo = thgrepo.repository(ui, path=paths.find_root()) + rev = None + if opts.get('rev'): + rev = opts.get('rev') + elif len(pats) == 1: + rev = pats[0] + return rUpdateDialog(repo, rev, None, opts)
 
35
36
37
38
39
40
 
 
 
41
42
43
44
45
46
 
 
47
48
49
 
65
66
67
68
69
 
 
70
71
72
73
74
75
76
 
 
77
78
79
 
 
80
81
82
83
 
 
84
85
86
87
 
 
88
89
90
91
92
 
 
 
93
94
95
 
97
98
99
100
101
102
103
 
 
 
 
104
105
106
 
35
36
37
 
 
 
38
39
40
41
42
43
44
 
 
45
46
47
48
49
 
65
66
67
 
 
68
69
70
71
72
73
74
 
 
75
76
77
 
 
78
79
80
81
 
 
82
83
84
85
 
 
86
87
88
89
 
 
 
90
91
92
93
94
95
 
97
98
99
 
 
 
 
100
101
102
103
104
105
106
@@ -35,15 +35,15 @@
  box.setSpacing(6)     ## main layout grid - grid = QGridLayout() - grid.setSpacing(6) - box.addLayout(grid) + self.grid = QGridLayout() + self.grid.setSpacing(6) + box.addLayout(self.grid)     ### target revision combo   self.rev_combo = combo = QComboBox()   combo.setEditable(True) - grid.addWidget(QLabel(_('Update to:')), 0, 0) - grid.addWidget(combo, 0, 1) + self.grid.addWidget(QLabel(_('Update to:')), 0, 0) + self.grid.addWidget(combo, 0, 1)     if rev is None:   rev = self.repo.dirstate.branch() @@ -65,31 +65,31 @@
  style = csinfo.labelstyle(contents=items, width=350, selectable=True)   factory = csinfo.factory(self.repo, style=style)   self.target_info = factory() - grid.addWidget(QLabel(_('Target:')), 1, 0, Qt.AlignLeft | Qt.AlignTop) - grid.addWidget(self.target_info, 1, 1) + self.grid.addWidget(QLabel(_('Target:')), 1, 0, Qt.AlignLeft | Qt.AlignTop) + self.grid.addWidget(self.target_info, 1, 1)     ### parent revision info   self.ctxs = self.repo[None].parents()   if len(self.ctxs) == 2:   self.p1_info = factory() - grid.addWidget(QLabel(_('Parent 1:')), 2, 0, Qt.AlignLeft | Qt.AlignTop) - grid.addWidget(self.p1_info, 2, 1) + self.grid.addWidget(QLabel(_('Parent 1:')), 2, 0, Qt.AlignLeft | Qt.AlignTop) + self.grid.addWidget(self.p1_info, 2, 1)   self.p2_info = factory() - grid.addWidget(QLabel(_('Parent 2:')), 3, 0, Qt.AlignLeft | Qt.AlignTop) - grid.addWidget(self.p2_info, 3, 1) + self.grid.addWidget(QLabel(_('Parent 2:')), 3, 0, Qt.AlignLeft | Qt.AlignTop) + self.grid.addWidget(self.p2_info, 3, 1)   else:   self.p1_info = factory() - grid.addWidget(QLabel(_('Parent:')), 2, 0, Qt.AlignLeft | Qt.AlignTop) - grid.addWidget(self.p1_info, 2, 1) + self.grid.addWidget(QLabel(_('Parent:')), 2, 0, Qt.AlignLeft | Qt.AlignTop) + self.grid.addWidget(self.p1_info, 2, 1)     ### options - optbox = QVBoxLayout() - optbox.setSpacing(6) + self.optbox = QVBoxLayout() + self.optbox.setSpacing(6)   expander = qtlib.ExpanderLabel(_('Options:'), False)   expander.expanded.connect(self.show_options) - row = grid.rowCount() - grid.addWidget(expander, row, 0, Qt.AlignLeft | Qt.AlignTop) - grid.addLayout(optbox, row, 1) + row = self.grid.rowCount() + self.grid.addWidget(expander, row, 0, Qt.AlignLeft | Qt.AlignTop) + self.grid.addLayout(self.optbox, row, 1)     self.discard_chk = QCheckBox(_('Discard local changes, no backup '   '(-C/--clean)')) @@ -97,10 +97,10 @@
  self.autoresolve_chk = QCheckBox(_('Automatically resolve merge conflicts '   'where possible'))   self.showlog_chk = QCheckBox(_('Always show command log')) - optbox.addWidget(self.discard_chk) - optbox.addWidget(self.merge_chk) - optbox.addWidget(self.autoresolve_chk) - optbox.addWidget(self.showlog_chk) + self.optbox.addWidget(self.discard_chk) + self.optbox.addWidget(self.merge_chk) + self.optbox.addWidget(self.autoresolve_chk) + self.optbox.addWidget(self.showlog_chk)     self.discard_chk.setChecked(bool(opts.get('clean')))   self.autoresolve_chk.setChecked(