您的位置:首页 > 运维架构

SVN版本问题:This client is too old to work with working copy

2012-06-19 17:16 513 查看
【问题描述】:MyEclipse插件版本1.4,客户端TortoiseSVN 1.6.6,用客户端commit代码之后,无法在MyEclipse下对工程就行update等操作,提示错误信息:This client is too old to work with working copy '.'; please get a newer Subversion client

【问题分析】:网络一气搜集之后,发现问题所在:.svn目录,里面保存着svn需要的一些版本信息,用TortoiseSVN去操作,会在.svn里增加一些文件。如果TortoiseSVN的版本比插件版本要高,那么再回到低版本去工作,就会有兼容性错误,因为老的客户端无法识别那些。

【解决方法】:

方案1(未试验,理论可行):

在线更新安装插件

help->sofeware updates-> find and install

方案2(测试可行):

一、下载:change-svn-wc-format.py(见附件) ,这是一个Python做的script,所以需要先下载Python

注意:1)从目前来看,最好使用Python 2.6,如果是用最新的3.0版本会出现问题。 比如无法打开Script,出现异常等等。2)安装后在环境变量的path中追加python安装路径:"C:/Python26"

二、1)把change-svn-wc-format.py放入C盘根目录,运行-->cmd-->cd C:/

2)执行修改:

C:/>change-svn-wc-format.py E:/work/sadapter 1.4 --force

参数说明:第一个change-svn-wc-format.py是执行脚本,第二个E:/work/sadapter是工程路径,第三个1.4是要修改到的版本,第四个--force不是必须的,在执行失败的情况下可以加入此参数。

3)结果:一阵processing:

引用
……Checking whether WC format can be converted

Writing WC format

Converted WC at 'E:/work/sadapter' into format 8 for Subversion 1.4

再去MyEclipse下更新done:

引用
…… A E:/work/sadapter/src/main/resources/efs/sadapter/config/spring/order/orderContext.xml

D E:/work/sadapter/src/main/resources/efs/sadapter/config/spring/contract/custRouteContext.xml

D E:/work/sadapter/src/main/resources/efs/sadapter/config/spring/contract/custInfo.xml

D E:/work/sadapter/src/main/resources/efs/sadapter/config/spring/contract/custAcctContext.xml

U E:/work/sadapter/src/main/resources/efs/sadapter/config/spring/contract/contractContext.xml

U E:/work/sadapter/src/main/filter-resources/efs/sadapter/config/spring/applicationContext.xml

Updated to revision 1235.

===== File Statistics: =====

Deleted: 19

Added: 14

Updated: 17

change-svn-wc-format.rar (4.7 KB)

或者将下列代码保存成change-svn-wc-format.py文件,chmod +x change-svn-wc-format.py修改执行权限,直接执行:sudo ../change-svn-wc-format.py kernel_imx 1.5

01.#!/usr/bin/env python
02.#
03.# change-svn-wc-format.py: Change the format of a Subversion working copy.
04.#
05.# ====================================================================
06.#    Licensed to the Apache Software Foundation (ASF) under one
07.#    or more contributor license agreements.  See the NOTICE file
08.#    distributed with this work for additional information
09.#    regarding copyright ownership.  The ASF licenses this file
10.#    to you under the Apache License, Version 2.0 (the
11.#    "License"); you may not use this file except in compliance
12.#    with the License.  You may obtain a copy of the License at
13.#
14.#      http://www.apache.org/licenses/LICENSE-2.0 15.#
16.#    Unless required by applicable law or agreed to in writing,
17.#    software distributed under the License is distributed on an
18.#    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
19.#    KIND, either express or implied.  See the License for the
20.#    specific language governing permissions and limitations
21.#    under the License.
22.# ====================================================================
23.
24.import sys
25.import os
26.import getopt
27.try:
28.  my_getopt = getopt.gnu_getopt
29.except AttributeError:
30.  my_getopt = getopt.getopt
31.
32.### The entries file parser in subversion/tests/cmdline/svntest/entry.py
33.### handles the XML-based WC entries file format used by Subversion
34.### 1.3 and lower.  It could be rolled into this script.
35.
36.LATEST_FORMATS = { "1.4" : 8,
37.                   "1.5" : 9,
38.                   "1.6" : 10,
39.                   # Do NOT add format 11 here.  See comment in must_retain_fields
40.                   # for why.
41.                 }
42.
43.def usage_and_exit(error_msg=None):
44.  """Write usage information and exit.  If ERROR_MSG is provide, that
45.  error message is printed first (to stderr), the usage info goes to
46.  stderr, and the script exits with a non-zero status.  Otherwise,
47.  usage info goes to stdout and the script exits with a zero status."""
48.  progname = os.path.basename(sys.argv[0])
49.
50.  stream = error_msg and sys.stderr or sys.stdout
51.  if error_msg:
52.    stream.write("ERROR: %s/n/n" % error_msg)
53.  stream.write("""/
54.usage: %s WC_PATH SVN_VERSION [--verbose] [--force] [--skip-unknown-format]
55.       %s --help
56.
57.Change the format of a Subversion working copy to that of SVN_VERSION.
58.
59.  --skip-unknown-format    : skip directories with unknown working copy
60.                             format and continue the update
61.
62.""" % (progname, progname))
63.  stream.flush()
64.  sys.exit(error_msg and 1 or 0)
65.
66.def get_adm_dir():
67.  """Return the name of Subversion's administrative directory,
68.  adjusted for the SVN_ASP_DOT_NET_HACK environment variable.  See
69.  <http://svn.apache.org/repos/asf/subversion/trunk/notes/asp-dot-net-hack.txt>
70.  for details."""
71.  return "SVN_ASP_DOT_NET_HACK" in os.environ and "_svn" or ".svn"
72.
73.class WCFormatConverter:
74.  "Performs WC format conversions."
75.  root_path = None
76.  error_on_unrecognized = True
77.  force = False
78.  verbosity = 0
79.
80.  def write_dir_format(self, format_nbr, dirname, paths):
81.    """Attempt to write the WC format FORMAT_NBR to the entries file
82.    for DIRNAME.  Throws LossyConversionException when not in --force
83.    mode, and unconvertable WC data is encountered."""
84.
85.    # Avoid iterating in unversioned directories.
86.    if not (get_adm_dir() in paths):
87.      del paths[:]
88.      return
89.
90.    # Process the entries file for this versioned directory.
91.    if self.verbosity:
92.      print("Processing directory '%s'" % dirname)
93.    entries = Entries(os.path.join(dirname, get_adm_dir(), "entries"))
94.    entries_parsed = True
95.    if self.verbosity:
96.      print("Parsing file '%s'" % entries.path)
97.    try:
98.      entries.parse(self.verbosity)
99.    except UnrecognizedWCFormatException, e:
100.      if self.error_on_unrecognized:
101.        raise
102.      sys.stderr.write("%s, skipping/n" % e)
103.      sys.stderr.flush()
104.      entries_parsed = False
105.
106.    if entries_parsed:
107.      format = Format(os.path.join(dirname, get_adm_dir(), "format"))
108.      if self.verbosity:
109.        print("Updating file '%s'" % format.path)
110.      format.write_format(format_nbr, self.verbosity)
111.    else:
112.      if self.verbosity:
113.        print("Skipping file '%s'" % format.path)
114.
115.    if self.verbosity:
116.      print("Checking whether WC format can be converted")
117.    try:
118.      entries.assert_valid_format(format_nbr, self.verbosity)
119.    except LossyConversionException, e:
120.      # In --force mode, ignore complaints about lossy conversion.
121.      if self.force:
122.        print("WARNING: WC format conversion will be lossy. Dropping "/
123.              "field(s) %s " % ", ".join(e.lossy_fields))
124.      else:
125.        raise
126.
127.    if self.verbosity:
128.      print("Writing WC format")
129.    entries.write_format(format_nbr)
130.
131.  def change_wc_format(self, format_nbr):
132.    """Walk all paths in a WC tree, and change their format to
133.    FORMAT_NBR.  Throw LossyConversionException or NotImplementedError
134.    if the WC format should not be converted, or is unrecognized."""
135.    for dirpath, dirs, files in os.walk(self.root_path):
136.      self.write_dir_format(format_nbr, dirpath, dirs + files)
137.
138.class Entries:
139.  """Represents a .svn/entries file.
140.
141.  'The entries file' section in subversion/libsvn_wc/README is a
142.  useful reference."""
143.
144.  # The name and index of each field composing an entry's record.
145.  entry_fields = (
146.    "name",
147.    "kind",
148.    "revision",
149.    "url",
150.    "repos",
151.    "schedule",
152.    "text-time",
153.    "checksum",
154.    "committed-date",
155.    "committed-rev",
156.    "last-author",
157.    "has-props",
158.    "has-prop-mods",
159.    "cachable-props",
160.    "present-props",
161.    "conflict-old",
162.    "conflict-new",
163.    "conflict-wrk",
164.    "prop-reject-file",
165.    "copied",
166.    "copyfrom-url",
167.    "copyfrom-rev",
168.    "deleted",
169.    "absent",
170.    "incomplete",
171.    "uuid",
172.    "lock-token",
173.    "lock-owner",
174.    "lock-comment",
175.    "lock-creation-date",
176.    "changelist",
177.    "keep-local",
178.    "working-size",
179.    "depth",
180.    "tree-conflicts",
181.    "file-external",
182.  )
183.
184.  # The format number.
185.  format_nbr = -1
186.
187.  # How many bytes the format number takes in the file.  (The format number
188.  # may have leading zeroes after using this script to convert format 10 to
189.  # format 9 -- which would write the format number as '09'.)
190.  format_nbr_bytes = -1
191.
192.  def __init__(self, path):
193.    self.path = path
194.    self.entries = []
195.
196.  def parse(self, verbosity=0):
197.    """Parse the entries file.  Throw NotImplementedError if the WC
198.    format is unrecognized."""
199.
200.    input = open(self.path, "r")
201.
202.    # Read WC format number from INPUT.  Validate that it
203.    # is a supported format for conversion.
204.    format_line = input.readline()
205.    try:
206.      self.format_nbr = int(format_line)
207.      self.format_nbr_bytes = len(format_line.rstrip()) # remove '/n'
208.    except ValueError:
209.      self.format_nbr = -1
210.      self.format_nbr_bytes = -1
211.    if not self.format_nbr in LATEST_FORMATS.values():
212.      raise UnrecognizedWCFormatException(self.format_nbr, self.path)
213.
214.    # Parse file into individual entries, to later inspect for
215.    # non-convertable data.
216.    entry = None
217.    while True:
218.      entry = self.parse_entry(input, verbosity)
219.      if entry is None:
220.        break
221.      self.entries.append(entry)
222.
223.    input.close()
224.
225.  def assert_valid_format(self, format_nbr, verbosity=0):
226.    if verbosity >= 2:
227.      print("Validating format for entries file '%s'" % self.path)
228.    for entry in self.entries:
229.      if verbosity >= 3:
230.        print("Validating format for entry '%s'" % entry.get_name())
231.      try:
232.        entry.assert_valid_format(format_nbr)
233.      except LossyConversionException:
234.        if verbosity >= 3:
235.          sys.stderr.write("Offending entry:/n%s/n" % entry)
236.          sys.stderr.flush()
237.        raise
238.
239.  def parse_entry(self, input, verbosity=0):
240.    "Read an individual entry from INPUT stream."
241.    entry = None
242.
243.    while True:
244.      line = input.readline()
245.      if line in ("", "/x0c/n"):
246.        # EOF or end of entry terminator encountered.
247.        break
248.
249.      if entry is None:
250.        entry = Entry()
251.
252.      # Retain the field value, ditching its field terminator ("/x0a").
253.      entry.fields.append(line[:-1])
254.
255.    if entry is not None and verbosity >= 3:
256.      sys.stdout.write(str(entry))
257.      print("-" * 76)
258.    return entry
259.
260.  def write_format(self, format_nbr):
261.    # Overwrite all bytes of the format number (which are the first bytes in
262.    # the file).  Overwrite format '10' by format '09', which will be converted
263.    # to '9' by Subversion when it rewrites the file.  (Subversion 1.4 and later
264.    # ignore leading zeroes in the format number.)
265.    assert len(str(format_nbr)) <= self.format_nbr_bytes
266.    format_string = '%0' + str(self.format_nbr_bytes) + 'd'
267.
268.    os.chmod(self.path, 0600)
269.    output = open(self.path, "r+", 0)
270.    output.write(format_string % format_nbr)
271.    output.close()
272.    os.chmod(self.path, 0400)
273.
274.class Entry:
275.  "Describes an entry in a WC."
276.
277.  # Maps format numbers to indices of fields within an entry's record that must
278.  # be retained when downgrading to that format.
279.  must_retain_fields = {
280.      # Not in 1.4: changelist, keep-local, depth, tree-conflicts, file-externals
281.      8  : (30, 31, 33, 34, 35),
282.      # Not in 1.5: tree-conflicts, file-externals
283.      9  : (34, 35),
284.      10 : (),
285.      # Downgrading from format 11 (1.7-dev) to format 10 is not possible,
286.      # because 11 does not use has-props and cachable-props (but 10 does).
287.      # Naively downgrading in that situation causes properties to disappear
288.      # from the wc.
289.      #
290.      # Downgrading from the 1.7 SQLite-based format to format 10 is not
291.      # implemented.
292.      }
293.
294.  def __init__(self):
295.    self.fields = []
296.
297.  def assert_valid_format(self, format_nbr):
298.    "Assure that conversion will be non-lossy by examining fields."
299.
300.    # Check whether lossy conversion is being attempted.
301.    lossy_fields = []
302.    for field_index in self.must_retain_fields[format_nbr]:
303.      if len(self.fields) - 1 >= field_index and self.fields[field_index]:
304.        lossy_fields.append(Entries.entry_fields[field_index])
305.    if lossy_fields:
306.      raise LossyConversionException(lossy_fields,
307.        "Lossy WC format conversion requested for entry '%s'/n"
308.        "Data for the following field(s) is unsupported by older versions "
309.        "of/nSubversion, and is likely to be subsequently discarded, and/or "
310.        "have/nunexpected side-effects: %s/n/n"
311.        "WC format conversion was cancelled, use the --force option to "
312.        "override/nthe default behavior."
313.        % (self.get_name(), ", ".join(lossy_fields)))
314.
315.  def get_name(self):
316.    "Return the name of this entry."
317.    return len(self.fields) > 0 and self.fields[0] or ""
318.
319.  def __str__(self):
320.    "Return all fields from this entry as a multi-line string."
321.    rep = ""
322.    for i in range(0, len(self.fields)):
323.      rep += "[%s] %s/n" % (Entries.entry_fields[i], self.fields[i])
324.    return rep
325.
326.class Format:
327.  """Represents a .svn/format file."""
328.
329.  def __init__(self, path):
330.    self.path = path
331.
332.  def write_format(self, format_nbr, verbosity=0):
333.    format_string = '%d/n'
334.    if os.path.exists(self.path):
335.      if verbosity >= 1:
336.        print("%s will be updated." % self.path)
337.      os.chmod(self.path,0600)
338.    else:
339.      if verbosity >= 1:
340.        print("%s does not exist, creating it." % self.path)
341.    format = open(self.path, "w")
342.    format.write(format_string % format_nbr)
343.    format.close()
344.    os.chmod(self.path, 0400)
345.
346.class LocalException(Exception):
347.  """Root of local exception class hierarchy."""
348.  pass
349.
350.class LossyConversionException(LocalException):
351.  "Exception thrown when a lossy WC format conversion is requested."
352.  def __init__(self, lossy_fields, str):
353.    self.lossy_fields = lossy_fields
354.    self.str = str
355.  def __str__(self):
356.    return self.str
357.
358.class UnrecognizedWCFormatException(LocalException):
359.  def __init__(self, format, path):
360.    self.format = format
361.    self.path = path
362.  def __str__(self):
363.    return ("Unrecognized WC format %d in '%s'; "
364.            "only formats 8, 9, and 10 can be supported") % (self.format, self.path)
365.
366.
367.def main():
368.  try:
369.    opts, args = my_getopt(sys.argv[1:], "vh?",
370.                           ["debug", "force", "skip-unknown-format",
371.                            "verbose", "help"])
372.  except:
373.    usage_and_exit("Unable to process arguments/options")
374.
375.  converter = WCFormatConverter()
376.
377.  # Process arguments.
378.  if len(args) == 2:
379.    converter.root_path = args[0]
380.    svn_version = args[1]
381.  else:
382.    usage_and_exit()
383.
384.  # Process options.
385.  debug = False
386.  for opt, value in opts:
387.    if opt in ("--help", "-h", "-?"):
388.      usage_and_exit()
389.    elif opt == "--force":
390.      converter.force = True
391.    elif opt == "--skip-unknown-format":
392.      converter.error_on_unrecognized = False
393.    elif opt in ("--verbose", "-v"):
394.      converter.verbosity += 1
395.    elif opt == "--debug":
396.      debug = True
397.    else:
398.      usage_and_exit("Unknown option '%s'" % opt)
399.
400.  try:
401.    new_format_nbr = LATEST_FORMATS[svn_version]
402.  except KeyError:
403.    usage_and_exit("Unsupported version number '%s'; "
404.                   "only 1.4, 1.5, and 1.6 can be supported" % svn_version)
405.
406.  try:
407.    converter.change_wc_format(new_format_nbr)
408.  except LocalException, e:
409.    if debug:
410.      raise
411.    sys.stderr.write("%s/n" % e)
412.    sys.stderr.flush()
413.    sys.exit(1)
414.
415.  print("Converted WC at '%s' into format %d for Subversion %s" % /
416.        (converter.root_path, new_format_nbr, svn_version))
417.
418.if __name__ == "__main__":
419.  main()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐