* morituri/common/common.py:

Add shrinkPath to write shorter path names.
	* morituri/test/test_common_common.py (added):
	  Add test.
	* morituri/program/cdparanoia.py:
	  Catch ENAMETOOLONG and shrink path.
	* morituri/common/program.py:
	  Update track result's filename if it was shrunk.
	* morituri/rip/cd.py:
	  set the possibly shrunk path on the result.
This commit is contained in:
Thomas Vander Stichele
2011-09-18 15:19:45 +00:00
parent 4fdfb7f58c
commit 2c27b73d09
6 changed files with 78 additions and 4 deletions

View File

@@ -1,3 +1,16 @@
2011-09-18 Thomas Vander Stichele <thomas at apestaart dot org>
* morituri/common/common.py:
Add shrinkPath to write shorter path names.
* morituri/test/test_common_common.py (added):
Add test.
* morituri/program/cdparanoia.py:
Catch ENAMETOOLONG and shrink path.
* morituri/common/program.py:
Update track result's filename if it was shrunk.
* morituri/rip/cd.py:
set the possibly shrunk path on the result.
2011-09-18 Thomas Vander Stichele <thomas at apestaart dot org>
* morituri/program/cdparanoia.py:

View File

@@ -21,6 +21,7 @@
# along with morituri. If not, see <http://www.gnu.org/licenses/>.
import os
import math
import tempfile
import shutil
@@ -254,3 +255,34 @@ class MissingDependencyException(Exception):
class EmptyError(Exception):
pass
def shrinkPath(path):
"""
Shrink a full path to a shorter version.
Used to handle ENAMETOOLONG
"""
parts = list(os.path.split(path))
length = len(parts[-1])
target = 127
if length <= target:
target = pow(2, int(math.log(length, 2))) - 1
name, ext = os.path.splitext(parts[-1])
target -= len(ext) + 1
# split on space, then reassemble
words = name.split(' ')
length = 0
pieces = []
for word in words:
if length + 1 + len(word) <= target:
pieces.append(word)
length += 1 + len(word)
else:
break
name = " ".join(pieces)
# ext includes period
parts[-1] = u'%s%s' % (name, ext)
path = os.path.join(*parts)
return path

View File

@@ -550,6 +550,9 @@ class Program(log.Loggable):
def ripTrack(self, runner, trackResult, offset, device, profile, taglist,
what=None):
"""
Ripping the track may change the track's filename as stored in
trackResult.
@param trackResult: the object to store information in.
@type trackResult: L{result.TrackResult}
@param number: track number (1-based)
@@ -583,6 +586,10 @@ class Program(log.Loggable):
trackResult.peak = t.peak
trackResult.quality = t.quality
if trackResult.filename != t.path:
trackResult.filename = t.path
self.info('Filename changed to %r', trackResult.filename)
def retagImage(self, runner, taglists):
cueImage = image.Image(self.cuePath)
t = image.ImageRetagTask(cueImage, taglists)

View File

@@ -21,6 +21,7 @@
# along with morituri. If not, see <http://www.gnu.org/licenses/>.
import os
import errno
import re
import stat
import shutil
@@ -478,6 +479,10 @@ class ReadVerifyTrackTask(log.Loggable, task.MultiSeparateTask):
try:
self.debug('Moving to final path %r', self.path)
shutil.move(self._tmppath, self.path)
except IOError, e:
if e.errno == errno.ENAMETOOLONG:
self.path = common.shrinkPath(self.path)
shutil.move(self._tmppath, self.path)
except Exception, e:
self.debug('Exception while moving to final path %r: %r',
self.path, log.getExceptionMessage(e))

View File

@@ -244,11 +244,11 @@ See http://sourceforge.net/tracker/?func=detail&aid=604751&group_id=2171&atid=1
# overlay this rip onto the Table
if number == 0:
# HTOA goes on index 0 of track 1
itable.setFile(1, 0, path, ittoc.getTrackStart(1),
number)
itable.setFile(1, 0, trackResult.filename,
ittoc.getTrackStart(1), number)
else:
itable.setFile(number, 1, path, ittoc.getTrackLength(number),
number)
itable.setFile(number, 1, trackResult.filename,
ittoc.getTrackLength(number), number)
prog.saveRipResult()

View File

@@ -0,0 +1,17 @@
# -*- Mode: Python; test-case-name: morituri.test.test_common_common -*-
# vi:si:et:sw=4:sts=4:ts=4
import os
from morituri.common import common
from morituri.test import common as tcommon
class ShrinkTestCase(tcommon.TestCase):
def testSufjan(self):
path = u'morituri/Sufjan Stevens - Illinois/02. Sufjan Stevens - The Black Hawk War, or, How to Demolish an Entire Civilization and Still Feel Good About Yourself in the Morning, or, We Apologize for the Inconvenience but You\'re Going to Have to Leave Now, or, "I Have Fought the Big Knives and Will Continue to Fight Them Until They Are Off Our Lands!".flac'
shorter = common.shrinkPath(path)
self.failUnless(os.path.splitext(path)[0].startswith(
os.path.splitext(shorter)[0]))
self.failIfEquals(path, shorter)