openSUSE Commits
Threads by month
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
February 2016
- 1 participants
- 1439 discussions
Hello community,
here is the log from the commit of package wicked for openSUSE:13.2:Update checked in at 2016-02-29 20:11:18
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:13.2:Update/wicked (Old)
and /work/SRC/openSUSE:13.2:Update/.wicked.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "wicked"
Changes:
--------
New Changes file:
NO CHANGES FILE!!!
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ _link ++++++
--- /var/tmp/diff_new_pack.Rgw4iG/_old 2016-02-29 20:11:22.000000000 +0100
+++ /var/tmp/diff_new_pack.Rgw4iG/_new 2016-02-29 20:11:22.000000000 +0100
@@ -1 +1 @@
-<link package='wicked.4608' cicount='copy' />
+<link package='wicked.4730' cicount='copy' />
1
0
Hello community,
here is the log from the commit of package ghc-hourglass for openSUSE:Factory checked in at 2016-02-29 09:14:45
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-hourglass (Old)
and /work/SRC/openSUSE:Factory/.ghc-hourglass.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-hourglass"
Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-hourglass/ghc-hourglass.changes 2015-05-27 12:43:12.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.ghc-hourglass.new/ghc-hourglass.changes 2016-02-29 09:16:14.000000000 +0100
@@ -1,0 +2,5 @@
+Sun Feb 28 21:48:31 UTC 2016 - mimi.vx(a)gmail.com
+
+- update to 0.2.10
+
+-------------------------------------------------------------------
Old:
----
hourglass-0.2.9.tar.gz
New:
----
hourglass-0.2.10.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ghc-hourglass.spec ++++++
--- /var/tmp/diff_new_pack.o6ZMiG/_old 2016-02-29 09:16:16.000000000 +0100
+++ /var/tmp/diff_new_pack.o6ZMiG/_new 2016-02-29 09:16:16.000000000 +0100
@@ -20,7 +20,7 @@
%bcond_with tests
Name: ghc-%{pkg_name}
-Version: 0.2.9
+Version: 0.2.10
Release: 0
Summary: Simple performant time related library
Group: System/Libraries
++++++ hourglass-0.2.9.tar.gz -> hourglass-0.2.10.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hourglass-0.2.9/Data/Hourglass/Compat.hs new/hourglass-0.2.10/Data/Hourglass/Compat.hs
--- old/hourglass-0.2.9/Data/Hourglass/Compat.hs 2015-04-01 16:53:50.000000000 +0200
+++ new/hourglass-0.2.10/Data/Hourglass/Compat.hs 2016-02-27 12:23:51.000000000 +0100
@@ -29,76 +29,10 @@
-- >
-- > offsetTime = H.TimezoneOffset $ fromIntegral $ T.timeZoneMinutes $ T.zonedTimeZone oldTime
--
+-- This module will be depreciated in favor of Time.Compat
+--
module Data.Hourglass.Compat
- ( dateFromPOSIXEpoch
- , dateFromTAIEpoch
- , diffTimeToTimeOfDay
+ ( module Time.Compat
) where
-import Data.Hourglass
-
--- | Convert an integer which represent the Number of days (To/From) POSIX Epoch
--- to a Date (POSIX Epoch is 1970-01-01).
-dateFromPOSIXEpoch :: Integer -- ^ number of days since POSIX Epoch
- -> Date
-dateFromPOSIXEpoch day = do
- let sec = Elapsed $ fromIntegral $ day * 86400
- timeConvert sec
-
--- | Number of days between POSIX Epoch and TAI Epoch
--- (between 1858-11-17 and 1970-01-01)
-daysTAItoPOSIX :: Integer
-daysTAItoPOSIX = 40587
-
--- | Convert an integer which represents the Number of days (To/From) TAI Epoch
--- This function allows use of the package time to easily convert the Day into
--- the Hourglass Date representation (TAI Epoch is 1858-11-17).
---
--- This function allows user to easily convert a Data.Time.Calendar.Day into Date
---
--- > import qualified Data.Time.Calendar as T
--- >
--- > timeDay :: T.Day
--- >
--- > dateFromTAIEpoch $ T.toModifiedJulianDay timeDay
-dateFromTAIEpoch :: Integer -- ^ number of days since TAI Epoch
- -> Date
-dateFromTAIEpoch dtai =
- dateFromPOSIXEpoch (dtai - daysTAItoPOSIX)
-
--- | Convert of differential of time of a day.
--- (it convers a Data.Time.Clock.DiffTime into a TimeOfDay)
---
--- Example with DiffTime type from time:
---
--- > import qualified Data.Time.Clock as T
--- >
--- > difftime :: T.DiffTime
--- >
--- > diffTimeToTimeOfDay difftime
---
--- Example with the TimeOfDay type from time:
---
--- > import qualified Data.Time.Clock as T
--- >
--- > timeofday :: T.TimeOfDay
--- >
--- > diffTimeToTimeOfDay $ T.timeOfDayToTime timeofday
-diffTimeToTimeOfDay :: Real t
- => t -- ^ number of seconds of the time of the day
- -> TimeOfDay
-diffTimeToTimeOfDay dt = do
- TimeOfDay
- { todHour = fromIntegral hours
- , todMin = fromIntegral minutes
- , todSec = fromIntegral seconds
- , todNSec = fromIntegral nsecs
- }
- where
- r :: Rational
- r = toRational dt
- (secs, nR) = properFraction r :: (Integer, Rational)
- nsecs :: Integer
- nsecs = round (nR * 1000000000)
- (minsofday, seconds) = secs `divMod` 60 :: (Integer, Integer)
- (hours, minutes) = minsofday `divMod` 60 :: (Integer, Integer)
+import Time.Compat
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hourglass-0.2.9/Data/Hourglass/Diff.hs new/hourglass-0.2.10/Data/Hourglass/Diff.hs
--- old/hourglass-0.2.9/Data/Hourglass/Diff.hs 2015-04-01 16:53:50.000000000 +0200
+++ new/hourglass-0.2.10/Data/Hourglass/Diff.hs 2016-02-27 12:23:51.000000000 +0100
@@ -34,7 +34,7 @@
{ periodYears :: !Int
, periodMonths :: !Int
, periodDays :: !Int
- } deriving (Read,Eq,Ord,Data,Typeable)
+ } deriving (Show,Read,Eq,Ord,Data,Typeable)
instance NFData Period where
rnf (Period y m d) = y `seq` m `seq` d `seq` ()
@@ -50,7 +50,7 @@
, durationMinutes :: !Minutes -- ^ number of minutes
, durationSeconds :: !Seconds -- ^ number of seconds
, durationNs :: !NanoSeconds -- ^ number of nanoseconds
- } deriving (Read,Eq,Ord,Data,Typeable)
+ } deriving (Show,Read,Eq,Ord,Data,Typeable)
instance NFData Duration where
rnf (Duration h m s ns) = h `seq` m `seq` s `seq` ns `seq` ()
@@ -86,10 +86,16 @@
where
(yDiffAcc,mStartPos) = (fromEnum mOrig + mDiff) `divMod` 12
loop y m d
- | d < dMonth = Date y (toEnum m) d
+ | d <= 0 =
+ let (m', y') = if m == 0
+ then (11, y - 1)
+ else (m - 1, y)
+ in
+ loop y' m' (daysInMonth y' (toEnum m') + d)
+ | d <= dMonth = Date y (toEnum m) d
| otherwise =
let newDiff = d - dMonth
- in if m == 12
+ in if m == 11
then loop (y+1) 0 newDiff
else loop y (m+1) newDiff
where dMonth = daysInMonth y (toEnum m)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hourglass-0.2.9/Data/Hourglass/Internal/Win.hs new/hourglass-0.2.10/Data/Hourglass/Internal/Win.hs
--- old/hourglass-0.2.9/Data/Hourglass/Internal/Win.hs 2015-04-01 16:53:50.000000000 +0200
+++ new/hourglass-0.2.10/Data/Hourglass/Internal/Win.hs 2016-02-27 12:23:51.000000000 +0100
@@ -61,9 +61,16 @@
systemGetTimezone :: IO TimezoneOffset
systemGetTimezone = do
- (_,tzInfo) <- getTimeZoneInformation
- return $ TimezoneOffset $ getTzOffset tzInfo
- where getTzOffset tzInfo = fromIntegral (tziBias tzInfo - tziDaylightBias tzInfo)
+ (tzMode,tzInfo) <- getTimeZoneInformation
+ case tzMode of
+ TzIdDaylight -> return $ toTO (tziBias tzInfo + tziDaylightBias tzInfo)
+ TzIdStandard -> return $ toTO (tziBias tzInfo + tziStandardBias tzInfo)
+ TzIdUnknown -> return $ toTO (tziBias tzInfo)
+ where
+ -- a negative value represent value how to go from local to UTC,
+ -- whereas TimezoneOffset represent the offset to go from UTC to local.
+ -- here we negate the bias to get the proper value represented.
+ toTO = TimezoneOffset . fromIntegral . negate
systemGetElapsedP :: IO ElapsedP
systemGetElapsedP = toElapsedP `fmap` getSystemTimeAsFileTime
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hourglass-0.2.9/Data/Hourglass/Types.hs new/hourglass-0.2.10/Data/Hourglass/Types.hs
--- old/hourglass-0.2.9/Data/Hourglass/Types.hs 2015-04-01 16:53:50.000000000 +0200
+++ new/hourglass-0.2.10/Data/Hourglass/Types.hs 2016-02-27 12:23:51.000000000 +0100
@@ -14,226 +14,10 @@
-- Most units use the unix epoch referential, but by no means reduce portability.
-- the unix referential works under the Windows platform or any other platforms.
--
+-- This module will be depreciated in favor of Time.Types
+--
module Data.Hourglass.Types
- (
- -- * Time units
- NanoSeconds(..)
- , Seconds(..)
- , Minutes(..)
- , Hours(..)
- , TimeInterval(..)
- -- * Time enumeration
- , Month(..)
- , WeekDay(..)
- -- * Timezone
- , TimezoneOffset(..)
- , timezoneOffsetToSeconds
- , timezone_UTC
- -- * Computer friendly format
- -- ** Unix elapsed
- , Elapsed(..)
- , ElapsedP(..)
- -- * Human friendly format
- -- ** Calendar time
- , Date(..)
- , TimeOfDay(..)
- , DateTime(..)
+ ( module Time.Types
) where
-import Data.Int
-import Data.Data
-import Data.Ratio
-import Control.DeepSeq
-import Data.Hourglass.Utils (pad2)
-
--- | Represent any time interval that has an
--- equivalent value to a number of seconds.
-class TimeInterval i where
- toSeconds :: i -> Seconds
- fromSeconds :: Seconds -> (i, Seconds)
-
--- | Nanoseconds
-newtype NanoSeconds = NanoSeconds Int64
- deriving (Read,Eq,Ord,Num,Data,Typeable,NFData)
-
-instance Show NanoSeconds where
- show (NanoSeconds v) = shows v "ns"
-
-instance TimeInterval NanoSeconds where
- toSeconds (NanoSeconds ns) = Seconds (ns `div` 1000000000)
- fromSeconds (Seconds s) = (NanoSeconds (s * 1000000000), 0)
-
--- | Number of seconds without a referential.
---
--- Can hold a number between [-2^63,2^63-1], which should
--- be good for some billions of years.
---
--- However, because of limitation in the calendar conversion
--- currently used, seconds should be in the range [-2^55,2^55-1],
--- which is good for only 1 billion of year.
-newtype Seconds = Seconds Int64
- deriving (Read,Eq,Ord,Enum,Num,Real,Integral,Data,Typeable,NFData)
-
-instance Show Seconds where
- show (Seconds s) = shows s "s"
-
-instance TimeInterval Seconds where
- toSeconds = id
- fromSeconds s = (s,0)
-
--- | Number of minutes without a referential.
-newtype Minutes = Minutes Int64
- deriving (Read,Eq,Ord,Enum,Num,Real,Integral,Data,Typeable,NFData)
-
-instance Show Minutes where
- show (Minutes s) = shows s "m"
-
-instance TimeInterval Minutes where
- toSeconds (Minutes m) = Seconds (m * 60)
- fromSeconds (Seconds s) = (Minutes m, Seconds s')
- where (m, s') = s `divMod` 60
-
--- | Number of hours without a referential.
-newtype Hours = Hours Int64
- deriving (Read,Eq,Ord,Enum,Num,Real,Integral,Data,Typeable,NFData)
-
-instance Show Hours where
- show (Hours s) = shows s "h"
-
-instance TimeInterval Hours where
- toSeconds (Hours h) = Seconds (h * 3600)
- fromSeconds (Seconds s) = (Hours h, Seconds s')
- where (h, s') = s `divMod` 3600
-
--- | A number of seconds elapsed since the unix epoch.
-newtype Elapsed = Elapsed Seconds
- deriving (Read,Eq,Ord,Num,Data,Typeable,NFData)
-
-instance Show Elapsed where
- show (Elapsed s) = show s
-
--- | A number of seconds and nanoseconds elapsed since the unix epoch.
-data ElapsedP = ElapsedP {-# UNPACK #-} !Elapsed {-# UNPACK #-} !NanoSeconds
- deriving (Read,Eq,Ord,Data,Typeable)
-
-instance Show ElapsedP where
- show (ElapsedP e ns) = shows e ('.' : show ns)
-
-instance NFData ElapsedP where rnf e = e `seq` ()
-
-instance Num ElapsedP where
- (+) = addElapsedP
- (-) = subElapsedP
- (ElapsedP e1 ns1) * (ElapsedP e2 ns2) = ElapsedP (e1*e2) (ns1*ns2)
- negate (ElapsedP e ns) = ElapsedP (negate e) ns
- abs (ElapsedP e ns) = ElapsedP (abs e) ns
- signum (ElapsedP e ns) = ElapsedP (signum e) ns
- fromInteger i = ElapsedP (Elapsed (fromIntegral i)) 0
-
-addElapsedP :: ElapsedP -> ElapsedP -> ElapsedP
-addElapsedP (ElapsedP e1 (NanoSeconds ns1)) (ElapsedP e2 (NanoSeconds ns2)) =
- let notNormalizedNS = ns1 + ns2
- (retainedNS, ns) = notNormalizedNS `divMod` 1000000000
- in ElapsedP (e1 + e2 + (Elapsed $ Seconds retainedNS)) (NanoSeconds ns)
-
-subElapsedP :: ElapsedP -> ElapsedP -> ElapsedP
-subElapsedP (ElapsedP e1 (NanoSeconds ns1)) (ElapsedP e2 (NanoSeconds ns2)) =
- let notNormalizedNS = ns1 - ns2
- notNormalizedS = e1 - e2
- in if notNormalizedNS < 0
- then ElapsedP (notNormalizedS - oneSecond) (NanoSeconds (1000000000 + notNormalizedNS))
- else ElapsedP notNormalizedS (NanoSeconds notNormalizedNS)
- where
- oneSecond :: Elapsed
- oneSecond = Elapsed $ Seconds 1
-
-instance Real ElapsedP where
- -- FIXME
- toRational (ElapsedP (Elapsed (Seconds s)) (NanoSeconds ns)) =
- fromIntegral s + (1000000000 % fromIntegral ns)
-
--- | Month of the year
-data Month =
- January
- | February
- | March
- | April
- | May
- | June
- | July
- | August
- | September
- | October
- | November
- | December
- deriving (Show,Eq,Ord,Enum,Data,Typeable)
-
--- | Day of the week
---
--- the enumeration starts on Sunday.
-data WeekDay =
- Sunday
- | Monday
- | Tuesday
- | Wednesday
- | Thursday
- | Friday
- | Saturday
- deriving (Show,Read,Eq,Ord,Enum,Data,Typeable)
-
--- | Offset against UTC in minutes
---
--- * a positive number represent a location East of UTC.
---
--- * a negative number represent a location West of UTC.
---
--- LocalTime t (-300) = t represent a time at UTC-5
--- LocalTime t (+480) = t represent a time at UTC+8
---
--- should be between -11H and +14H
-newtype TimezoneOffset = TimezoneOffset
- { timezoneOffsetToMinutes :: Int -- ^ return the number of minutes
- } deriving (Eq,Ord,Data,Typeable,NFData)
-
--- | Return the number of seconds associated with a timezone
-timezoneOffsetToSeconds :: TimezoneOffset -> Seconds
-timezoneOffsetToSeconds (TimezoneOffset ofs) = Seconds (fromIntegral ofs * 60)
-
-instance Show TimezoneOffset where
- show (TimezoneOffset tz) =
- concat [if tz < 0 then "-" else "+", pad2 tzH, pad2 tzM]
- where (tzH, tzM) = abs tz `divMod` 60
-
--- | The UTC timezone. offset of 0
-timezone_UTC :: TimezoneOffset
-timezone_UTC = TimezoneOffset 0
-
--- | human date representation using common calendar
-data Date = Date
- { dateYear :: {-# UNPACK #-} !Int -- ^ year (Common Era)
- , dateMonth :: !Month -- ^ month of the year
- , dateDay :: {-# UNPACK #-} !Int -- ^ day of the month, between 1 to 31
- } deriving (Show,Eq,Ord,Data,Typeable)
-
-instance NFData Date where
- rnf (Date y m d) = y `seq` m `seq` d `seq` ()
-
--- | human time representation of hour, minutes, seconds in a day.
-data TimeOfDay = TimeOfDay
- { todHour :: {-# UNPACK #-} !Hours -- ^ hours, between 0 and 23
- , todMin :: {-# UNPACK #-} !Minutes -- ^ minutes, between 0 and 59
- , todSec :: {-# UNPACK #-} !Seconds -- ^ seconds, between 0 and 59. 60 when having leap second */
- , todNSec :: {-# UNPACK #-} !NanoSeconds -- ^ nanoseconds, between 0 and 999999999 */
- } deriving (Show,Eq,Ord,Data,Typeable)
-
-instance NFData TimeOfDay where
- rnf (TimeOfDay h m s ns) = h `seq` m `seq` s `seq` ns `seq` ()
-
--- | Date and Time
-data DateTime = DateTime
- { dtDate :: Date
- , dtTime :: TimeOfDay
- } deriving (Show,Eq,Ord,Data,Typeable)
-
-instance NFData DateTime where
- rnf (DateTime d t) = rnf d `seq` rnf t `seq` ()
+import Time.Types
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hourglass-0.2.9/Data/Hourglass.hs new/hourglass-0.2.10/Data/Hourglass.hs
--- old/hourglass-0.2.9/Data/Hourglass.hs 2015-04-01 16:53:50.000000000 +0200
+++ new/hourglass-0.2.10/Data/Hourglass.hs 2016-02-27 12:23:51.000000000 +0100
@@ -37,4 +37,4 @@
import Data.Hourglass.Types
import Data.Hourglass.Local
import Data.Hourglass.Zone
-import Data.Hourglass.Calendar (isLeapYear, getWeekDay, getDayOfTheYear)
+import Data.Hourglass.Calendar (isLeapYear, getWeekDay, getDayOfTheYear, daysInMonth)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hourglass-0.2.9/System/Hourglass.hs new/hourglass-0.2.10/System/Hourglass.hs
--- old/hourglass-0.2.9/System/Hourglass.hs 2015-04-01 16:53:50.000000000 +0200
+++ new/hourglass-0.2.10/System/Hourglass.hs 2016-02-27 12:23:51.000000000 +0100
@@ -7,52 +7,10 @@
--
-- Get the system timezone and current time value in multiple formats
--
+-- This module will be depreciated in favor of Time.System
+--
module System.Hourglass
- (
- -- * Current time in computer friendly format
- timeCurrent
- , timeCurrentP
- -- * Current time in human friendly DateTime format
- , dateCurrent
- , localDateCurrent
- , localDateCurrentAt
- -- * System timezone
- , timezoneCurrent
+ ( module Time.System
) where
-import Control.Applicative
-import Data.Hourglass.Types
-import Data.Hourglass.Time
-import Data.Hourglass.Local
-import Data.Hourglass.Internal (systemGetElapsedP, systemGetElapsed, systemGetTimezone)
-
--- | Get the current elapsed seconds since epoch
-timeCurrent :: IO Elapsed
-timeCurrent = systemGetElapsed
-
--- | Get the current elapsed seconds (precise to the nanosecond) since epoch
-timeCurrentP :: IO ElapsedP
-timeCurrentP = systemGetElapsedP
-
--- | Get the current global date
---
--- This is equivalent to:
---
--- > timeGetDateTimeOfDay `fmap` timeCurrentP
-dateCurrent :: IO DateTime
-dateCurrent = timeGetDateTimeOfDay <$> timeCurrentP
-
--- | Get the localized date by using 'timezoneCurrent' and 'dateCurrent'
-localDateCurrent :: IO (LocalTime DateTime)
-localDateCurrent = localTimeSetTimezone <$> timezoneCurrent
- <*> (localTimeFromGlobal <$> dateCurrent)
-
--- | Get the localized date at a specific timezone offset.
-localDateCurrentAt :: TimezoneOffset -> IO (LocalTime DateTime)
-localDateCurrentAt tz = localTimeSetTimezone tz . localTimeFromGlobal <$> dateCurrent
-
--- | Get the current timezone offset
---
--- This include daylight saving time when in operation.
-timezoneCurrent :: IO TimezoneOffset
-timezoneCurrent = systemGetTimezone
+import Time.System
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hourglass-0.2.9/Time/Compat.hs new/hourglass-0.2.10/Time/Compat.hs
--- old/hourglass-0.2.9/Time/Compat.hs 1970-01-01 01:00:00.000000000 +0100
+++ new/hourglass-0.2.10/Time/Compat.hs 2016-02-27 12:23:51.000000000 +0100
@@ -0,0 +1,104 @@
+-- |
+-- Module : Time.Compat
+-- License : BSD-style
+-- Maintainer : Nicolas DI PRIMA <nicolas(a)di-prima.fr>
+--
+-- Basic Time conversion compatibility.
+--
+-- This module aims to help conversion between the types from the package
+-- time to the package hourglass.
+--
+-- Example of use (extracted from file Example/Time/Compat.hs):
+--
+-- > import Data.Hourglass as H
+-- > import Data.Hourglass.Compat as C
+-- > import Data.Time as T
+-- >
+-- > transpose :: T.ZonedTime
+-- > -> H.LocalTime H.DateTime
+-- > transpose oldTime =
+-- > H.localTime
+-- > offsetTime
+-- > (H.DateTime newDate timeofday)
+-- > where
+-- > newDate :: H.Date
+-- > newDate = C.dateFromTAIEpoch $ T.toModifiedJulianDay $ T.localDay $ T.zonedTimeToLocalTime oldTime
+-- >
+-- > timeofday :: H.TimeOfDay
+-- > timeofday = C.diffTimeToTimeOfDay $ T.timeOfDayToTime $ T.localTimeOfDay $ T.zonedTimeToLocalTime oldTime
+-- >
+-- > offsetTime = H.TimezoneOffset $ fromIntegral $ T.timeZoneMinutes $ T.zonedTimeZone oldTime
+--
+module Time.Compat
+ ( dateFromPOSIXEpoch
+ , dateFromTAIEpoch
+ , diffTimeToTimeOfDay
+ ) where
+
+import Data.Hourglass
+
+-- | Convert an integer which represent the Number of days (To/From) POSIX Epoch
+-- to a Date (POSIX Epoch is 1970-01-01).
+dateFromPOSIXEpoch :: Integer -- ^ number of days since POSIX Epoch
+ -> Date
+dateFromPOSIXEpoch day = do
+ let sec = Elapsed $ fromIntegral $ day * 86400
+ timeConvert sec
+
+-- | Number of days between POSIX Epoch and TAI Epoch
+-- (between 1858-11-17 and 1970-01-01)
+daysTAItoPOSIX :: Integer
+daysTAItoPOSIX = 40587
+
+-- | Convert an integer which represents the Number of days (To/From) TAI Epoch
+-- This function allows use of the package time to easily convert the Day into
+-- the Hourglass Date representation (TAI Epoch is 1858-11-17).
+--
+-- This function allows user to easily convert a Data.Time.Calendar.Day into Date
+--
+-- > import qualified Data.Time.Calendar as T
+-- >
+-- > timeDay :: T.Day
+-- >
+-- > dateFromTAIEpoch $ T.toModifiedJulianDay timeDay
+dateFromTAIEpoch :: Integer -- ^ number of days since TAI Epoch
+ -> Date
+dateFromTAIEpoch dtai =
+ dateFromPOSIXEpoch (dtai - daysTAItoPOSIX)
+
+-- | Convert of differential of time of a day.
+-- (it convers a Data.Time.Clock.DiffTime into a TimeOfDay)
+--
+-- Example with DiffTime type from time:
+--
+-- > import qualified Data.Time.Clock as T
+-- >
+-- > difftime :: T.DiffTime
+-- >
+-- > diffTimeToTimeOfDay difftime
+--
+-- Example with the TimeOfDay type from time:
+--
+-- > import qualified Data.Time.Clock as T
+-- >
+-- > timeofday :: T.TimeOfDay
+-- >
+-- > diffTimeToTimeOfDay $ T.timeOfDayToTime timeofday
+diffTimeToTimeOfDay :: Real t
+ => t -- ^ number of seconds of the time of the day
+ -> TimeOfDay
+diffTimeToTimeOfDay dt = do
+ TimeOfDay
+ { todHour = fromIntegral hours
+ , todMin = fromIntegral minutes
+ , todSec = fromIntegral seconds
+ , todNSec = fromIntegral nsecs
+ }
+ where
+ r :: Rational
+ r = toRational dt
+ (secs, nR) = properFraction r :: (Integer, Rational)
+ nsecs :: Integer
+ nsecs = round (nR * 1000000000)
+ (minsofday, seconds) = secs `divMod` 60 :: (Integer, Integer)
+ (hours, minutes) = minsofday `divMod` 60 :: (Integer, Integer)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hourglass-0.2.9/Time/System.hs new/hourglass-0.2.10/Time/System.hs
--- old/hourglass-0.2.9/Time/System.hs 1970-01-01 01:00:00.000000000 +0100
+++ new/hourglass-0.2.10/Time/System.hs 2016-02-27 12:23:51.000000000 +0100
@@ -0,0 +1,58 @@
+-- |
+-- Module : Time.System
+-- License : BSD-style
+-- Maintainer : Vincent Hanquez <vincent(a)snarc.org>
+-- Stability : experimental
+-- Portability : unknown
+--
+-- Get the system timezone and current time value in multiple formats
+--
+module Time.System
+ (
+ -- * Current time in computer friendly format
+ timeCurrent
+ , timeCurrentP
+ -- * Current time in human friendly DateTime format
+ , dateCurrent
+ , localDateCurrent
+ , localDateCurrentAt
+ -- * System timezone
+ , timezoneCurrent
+ ) where
+
+import Control.Applicative
+import Time.Types
+import Data.Hourglass.Time
+import Data.Hourglass.Local
+import Data.Hourglass.Internal (systemGetElapsedP, systemGetElapsed, systemGetTimezone)
+
+-- | Get the current elapsed seconds since epoch
+timeCurrent :: IO Elapsed
+timeCurrent = systemGetElapsed
+
+-- | Get the current elapsed seconds (precise to the nanosecond) since epoch
+timeCurrentP :: IO ElapsedP
+timeCurrentP = systemGetElapsedP
+
+-- | Get the current global date
+--
+-- This is equivalent to:
+--
+-- > timeGetDateTimeOfDay `fmap` timeCurrentP
+dateCurrent :: IO DateTime
+dateCurrent = timeGetDateTimeOfDay <$> timeCurrentP
+
+-- | Get the localized date by using 'timezoneCurrent' and 'dateCurrent'
+localDateCurrent :: IO (LocalTime DateTime)
+localDateCurrent = localTimeSetTimezone <$> timezoneCurrent
+ <*> (localTimeFromGlobal <$> dateCurrent)
+
+-- | Get the localized date at a specific timezone offset.
+localDateCurrentAt :: TimezoneOffset -> IO (LocalTime DateTime)
+localDateCurrentAt tz = localTimeSetTimezone tz . localTimeFromGlobal <$> dateCurrent
+
+-- | Get the current timezone offset
+--
+-- This include daylight saving time when in operation.
+timezoneCurrent :: IO TimezoneOffset
+timezoneCurrent = systemGetTimezone
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hourglass-0.2.9/Time/Types.hs new/hourglass-0.2.10/Time/Types.hs
--- old/hourglass-0.2.9/Time/Types.hs 1970-01-01 01:00:00.000000000 +0100
+++ new/hourglass-0.2.10/Time/Types.hs 2016-02-27 12:23:51.000000000 +0100
@@ -0,0 +1,244 @@
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+-- |
+-- Module : Time.Types
+-- License : BSD-style
+-- Maintainer : Vincent Hanquez <vincent(a)snarc.org>
+--
+-- Basic times units and types.
+--
+-- While pratically some units could hold infinite values, for practical
+-- and efficient purpose they are limited to int64 types for seconds
+-- and int types for years.
+--
+-- Most units use the unix epoch referential, but by no means reduce portability.
+-- the unix referential works under the Windows platform or any other platforms.
+--
+module Time.Types
+ (
+ -- * Time units
+ NanoSeconds(..)
+ , Seconds(..)
+ , Minutes(..)
+ , Hours(..)
+ , TimeInterval(..)
+ -- * Time enumeration
+ , Month(..)
+ , WeekDay(..)
+ -- * Timezone
+ , TimezoneOffset(..)
+ , timezoneOffsetToSeconds
+ , timezone_UTC
+ -- * Computer friendly format
+ -- ** Unix elapsed
+ , Elapsed(..)
+ , ElapsedP(..)
+ -- * Human friendly format
+ -- ** Calendar time
+ , Date(..)
+ , TimeOfDay(..)
+ , DateTime(..)
+ ) where
+
+import Data.Int
+import Data.Data
+import Data.Ratio
+import Control.DeepSeq
+import Data.Hourglass.Utils (pad2)
+
+-- | Represent any time interval that has an
+-- equivalent value to a number of seconds.
+class TimeInterval i where
+ toSeconds :: i -> Seconds
+ fromSeconds :: Seconds -> (i, Seconds)
+
+-- | Nanoseconds
+newtype NanoSeconds = NanoSeconds Int64
+ deriving (Read,Eq,Ord,Num,Data,Typeable,NFData)
+
+instance Show NanoSeconds where
+ show (NanoSeconds v) = shows v "ns"
+
+instance TimeInterval NanoSeconds where
+ toSeconds (NanoSeconds ns) = Seconds (ns `div` 1000000000)
+ fromSeconds (Seconds s) = (NanoSeconds (s * 1000000000), 0)
+
+-- | Number of seconds without a referential.
+--
+-- Can hold a number between [-2^63,2^63-1], which should
+-- be good for some billions of years.
+--
+-- However, because of limitation in the calendar conversion
+-- currently used, seconds should be in the range [-2^55,2^55-1],
+-- which is good for only 1 billion of year.
+newtype Seconds = Seconds Int64
+ deriving (Read,Eq,Ord,Enum,Num,Real,Integral,Data,Typeable,NFData)
+
+instance Show Seconds where
+ show (Seconds s) = shows s "s"
+
+instance TimeInterval Seconds where
+ toSeconds = id
+ fromSeconds s = (s,0)
+
+-- | Number of minutes without a referential.
+newtype Minutes = Minutes Int64
+ deriving (Read,Eq,Ord,Enum,Num,Real,Integral,Data,Typeable,NFData)
+
+instance Show Minutes where
+ show (Minutes s) = shows s "m"
+
+instance TimeInterval Minutes where
+ toSeconds (Minutes m) = Seconds (m * 60)
+ fromSeconds (Seconds s) = (Minutes m, Seconds s')
+ where (m, s') = s `divMod` 60
+
+-- | Number of hours without a referential.
+newtype Hours = Hours Int64
+ deriving (Read,Eq,Ord,Enum,Num,Real,Integral,Data,Typeable,NFData)
+
+instance Show Hours where
+ show (Hours s) = shows s "h"
+
+instance TimeInterval Hours where
+ toSeconds (Hours h) = Seconds (h * 3600)
+ fromSeconds (Seconds s) = (Hours h, Seconds s')
+ where (h, s') = s `divMod` 3600
+
+-- | A number of seconds elapsed since the unix epoch.
+newtype Elapsed = Elapsed Seconds
+ deriving (Read,Eq,Ord,Num,Data,Typeable,NFData)
+
+instance Show Elapsed where
+ show (Elapsed s) = show s
+
+-- | A number of seconds and nanoseconds elapsed since the unix epoch.
+data ElapsedP = ElapsedP {-# UNPACK #-} !Elapsed {-# UNPACK #-} !NanoSeconds
+ deriving (Read,Eq,Ord,Data,Typeable)
+
+instance Show ElapsedP where
+ show (ElapsedP e ns) = shows e ('.' : show ns)
+
+instance NFData ElapsedP where rnf e = e `seq` ()
+
+instance Num ElapsedP where
+ (+) = addElapsedP
+ (-) = subElapsedP
+ (ElapsedP e1 ns1) * (ElapsedP e2 ns2) = ElapsedP (e1*e2) (ns1*ns2)
+ negate (ElapsedP e ns) = ElapsedP (negate e) ns
+ abs (ElapsedP e ns) = ElapsedP (abs e) ns
+ signum (ElapsedP e ns) = ElapsedP (signum e) ns
+ fromInteger i = ElapsedP (Elapsed (fromIntegral i)) 0
+
+addElapsedP :: ElapsedP -> ElapsedP -> ElapsedP
+addElapsedP (ElapsedP e1 (NanoSeconds ns1)) (ElapsedP e2 (NanoSeconds ns2)) =
+ let notNormalizedNS = ns1 + ns2
+ (retainedNS, ns) = notNormalizedNS `divMod` 1000000000
+ in ElapsedP (e1 + e2 + (Elapsed $ Seconds retainedNS)) (NanoSeconds ns)
+
+subElapsedP :: ElapsedP -> ElapsedP -> ElapsedP
+subElapsedP (ElapsedP e1 (NanoSeconds ns1)) (ElapsedP e2 (NanoSeconds ns2)) =
+ let notNormalizedNS = ns1 - ns2
+ notNormalizedS = e1 - e2
+ in if notNormalizedNS < 0
+ then ElapsedP (notNormalizedS - oneSecond) (NanoSeconds (1000000000 + notNormalizedNS))
+ else ElapsedP notNormalizedS (NanoSeconds notNormalizedNS)
+ where
+ oneSecond :: Elapsed
+ oneSecond = Elapsed $ Seconds 1
+
+instance Real ElapsedP where
+ -- FIXME
+ toRational (ElapsedP (Elapsed (Seconds s)) (NanoSeconds ns)) =
+ fromIntegral s + (1000000000 % fromIntegral ns)
+
+-- | Month of the year
+data Month =
+ January
+ | February
+ | March
+ | April
+ | May
+ | June
+ | July
+ | August
+ | September
+ | October
+ | November
+ | December
+ deriving (Show,Read,Eq,Ord,Enum,Data,Typeable,Bounded)
+
+-- | Day of the week
+--
+-- the enumeration starts on Sunday.
+data WeekDay =
+ Sunday
+ | Monday
+ | Tuesday
+ | Wednesday
+ | Thursday
+ | Friday
+ | Saturday
+ deriving (Show,Read,Eq,Ord,Enum,Data,Typeable,Bounded)
+
+-- | Offset against UTC in minutes to obtain from UTC time, local time.
+--
+-- * a positive number represent a location East of UTC.
+--
+-- * a negative number represent a location West of UTC.
+--
+-- LocalTime t (-300) = t represent a time at UTC-5
+-- LocalTime t (+480) = t represent a time at UTC+8
+--
+-- should be between -11H and +14H
+--
+-- Example:
+-- in AUSEDT (UTC+1000 with daylight = UTC+1100), local time is 15:47;
+-- Thus, UTC time is 04:47, and TimezoneOffset is +660 (minutes)
+--
+newtype TimezoneOffset = TimezoneOffset
+ { timezoneOffsetToMinutes :: Int -- ^ return the number of minutes
+ } deriving (Eq,Ord,Data,Typeable,NFData)
+
+-- | Return the number of seconds associated with a timezone
+timezoneOffsetToSeconds :: TimezoneOffset -> Seconds
+timezoneOffsetToSeconds (TimezoneOffset ofs) = Seconds (fromIntegral ofs * 60)
+
+instance Show TimezoneOffset where
+ show (TimezoneOffset tz) =
+ concat [if tz < 0 then "-" else "+", pad2 tzH, pad2 tzM]
+ where (tzH, tzM) = abs tz `divMod` 60
+
+-- | The UTC timezone. offset of 0
+timezone_UTC :: TimezoneOffset
+timezone_UTC = TimezoneOffset 0
+
+-- | human date representation using common calendar
+data Date = Date
+ { dateYear :: {-# UNPACK #-} !Int -- ^ year (Common Era)
+ , dateMonth :: !Month -- ^ month of the year
+ , dateDay :: {-# UNPACK #-} !Int -- ^ day of the month, between 1 to 31
+ } deriving (Show,Read,Eq,Ord,Data,Typeable)
+
+instance NFData Date where
+ rnf (Date y m d) = y `seq` m `seq` d `seq` ()
+
+-- | human time representation of hour, minutes, seconds in a day.
+data TimeOfDay = TimeOfDay
+ { todHour :: {-# UNPACK #-} !Hours -- ^ hours, between 0 and 23
+ , todMin :: {-# UNPACK #-} !Minutes -- ^ minutes, between 0 and 59
+ , todSec :: {-# UNPACK #-} !Seconds -- ^ seconds, between 0 and 59. 60 when having leap second */
+ , todNSec :: {-# UNPACK #-} !NanoSeconds -- ^ nanoseconds, between 0 and 999999999 */
+ } deriving (Show,Read,Eq,Ord,Data,Typeable)
+
+instance NFData TimeOfDay where
+ rnf (TimeOfDay h m s ns) = h `seq` m `seq` s `seq` ns `seq` ()
+
+-- | Date and Time
+data DateTime = DateTime
+ { dtDate :: Date
+ , dtTime :: TimeOfDay
+ } deriving (Show,Read,Eq,Ord,Data,Typeable)
+
+instance NFData DateTime where
+ rnf (DateTime d t) = rnf d `seq` rnf t `seq` ()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hourglass-0.2.9/hourglass.cabal new/hourglass-0.2.10/hourglass.cabal
--- old/hourglass-0.2.9/hourglass.cabal 2015-04-01 16:53:50.000000000 +0200
+++ new/hourglass-0.2.10/hourglass.cabal 2016-02-27 12:23:51.000000000 +0100
@@ -1,5 +1,5 @@
Name: hourglass
-Version: 0.2.9
+Version: 0.2.10
Synopsis: simple performant time related library
Description:
Simple time library focusing on simple but powerful and performant API
@@ -23,7 +23,10 @@
, tests/TimeDB.hs
Library
- Exposed-modules: Data.Hourglass
+ Exposed-modules: Time.Types
+ , Time.System
+ , Time.Compat
+ , Data.Hourglass
, Data.Hourglass.Types
, Data.Hourglass.Epoch
, Data.Hourglass.Compat
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hourglass-0.2.9/tests/Tests.hs new/hourglass-0.2.10/tests/Tests.hs
--- old/hourglass-0.2.9/tests/Tests.hs 2015-04-01 16:53:50.000000000 +0200
+++ new/hourglass-0.2.10/tests/Tests.hs 2016-02-27 12:23:51.000000000 +0100
@@ -51,6 +51,15 @@
(h' , mi') = dt' `divMod` 60
(DateTime (Date y m d) (TimeOfDay h mi sec _)) = localTimeToGlobal localtime
+-- | The @Date@ type is able to represent some values that aren't actually legal,
+-- specifically dates with a day field outside of the range of dates in the
+-- month. This function validates a @Date@. It is conservative; it only verifies
+-- that the day is less than 31. TODO: It would be nice to tighten this up a
+-- bit. There's a daysInMonth function we could use for this,
+-- but Data.Hourglass.Calendar, but it isn't exposed.
+isValidDate :: Date -> Bool
+isValidDate (Date _ _ d) = d > 0 && d <= 31
+
-- windows native functions to convert time cannot handle time before year 1601
#ifdef WINDOWS
loElapsed = -11644473600 -- ~ year 1601
@@ -183,6 +192,8 @@
(toEnum ((fromEnum m+1) `mod` 12) `eq` m') &&
(if m == December then (y+1) `eq` y' else y `eq` y')
-}
+ , testProperty "dateAddPeriod" $ (\date period ->
+ isValidDate (date `dateAddPeriod` period))
]
, testGroup "formating"
[ testProperty "iso8601 date" $ \(e :: Elapsed) ->
1
0
Hello community,
here is the log from the commit of package hlint for openSUSE:Factory checked in at 2016-02-29 09:14:40
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/hlint (Old)
and /work/SRC/openSUSE:Factory/.hlint.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "hlint"
Changes:
--------
--- /work/SRC/openSUSE:Factory/hlint/hlint.changes 2016-02-11 12:37:29.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.hlint.new/hlint.changes 2016-02-29 09:16:11.000000000 +0100
@@ -1,0 +2,8 @@
+Sun Feb 28 21:42:14 UTC 2016 - mimi.vx(a)gmail.com
+
+- update to 1.9.30
+* fix incorrect hints of foldr/foldl on a tuple accumulator
+* add warnings about foldable methods on tuple
+* Put warnings before suggestions in the HTML report
+
+-------------------------------------------------------------------
Old:
----
hlint-1.9.28.tar.gz
New:
----
hlint-1.9.30.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ hlint.spec ++++++
--- /var/tmp/diff_new_pack.ZKYdIr/_old 2016-02-29 09:16:13.000000000 +0100
+++ /var/tmp/diff_new_pack.ZKYdIr/_new 2016-02-29 09:16:13.000000000 +0100
@@ -20,7 +20,7 @@
# no useful debuginfo for Haskell packages without C sources
%global debug_package %{nil}
Name: hlint
-Version: 1.9.28
+Version: 1.9.30
Release: 0
Summary: Source code suggestions
License: BSD-3-Clause
++++++ hlint-1.9.28.tar.gz -> hlint-1.9.30.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hlint-1.9.28/CHANGES.txt new/hlint-1.9.30/CHANGES.txt
--- old/hlint-1.9.28/CHANGES.txt 2016-02-04 09:55:19.000000000 +0100
+++ new/hlint-1.9.30/CHANGES.txt 2016-02-26 21:55:03.000000000 +0100
@@ -1,5 +1,10 @@
Changelog for HLint
+1.9.30
+ #220, fix incorrect hints of foldr/foldl on a tuple accumulator
+1.9.29
+ #219, add warnings about foldable methods on tuple
+ Put warnings before suggestions in the HTML report
1.9.28
#215, spot newtype deriving inside classes
1.9.27
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hlint-1.9.28/data/Default.hs new/hlint-1.9.30/data/Default.hs
--- old/hlint-1.9.28/data/Default.hs 2016-02-04 09:55:19.000000000 +0100
+++ new/hlint-1.9.30/data/Default.hs 2016-02-26 21:55:03.000000000 +0100
@@ -509,6 +509,51 @@
warn "Evaluate" = zip [] [] ==> []
warn "Evaluate" = const x y ==> x
+-- FOLDABLE + TUPLES
+
+warn "Using foldr on tuple" = foldr f z (x,b) ==> f b z
+warn "Using foldr' on tuple" = foldr' f z (x,b) ==> f b z
+warn "Using foldl on tuple" = foldl f z (x,b) ==> f z b
+warn "Using foldl' on tuple" = foldl' f z (x,b) ==> f z b
+warn "Using foldMap on tuple" = foldMap f (x,b) ==> f b
+warn "Using foldr1 on tuple" = foldr1 f (x,b) ==> b
+warn "Using foldl1 on tuple" = foldl1 f (x,b) ==> b
+warn "Using elem on tuple" = elem e (x,b) ==> e == b
+warn "Using fold on tuple" = fold (x,b) ==> b
+warn "Using toList on tuple" = toList (x,b) ==> b
+warn "Using maximum on tuple" = maximum (x,b) ==> b
+warn "Using minimum on tuple" = minimum (x,b) ==> b
+warn "Using sum on tuple" = sum (x,b) ==> b
+warn "Using product on tuple" = product (x,b) ==> b
+warn "Using concat on tuple" = concat (x,b) ==> b
+warn "Using and on tuple" = and (x,b) ==> b
+warn "Using or on tuple" = or (x,b) ==> b
+warn "Using any on tuple" = any f (x,b) ==> f b
+warn "Using all on tuple" = all f (x,b) ==> f b
+
+warn "Using foldr on tuple" = foldr f z (x,y,b) ==> f b z
+warn "Using foldr' on tuple" = foldr' f z (x,y,b) ==> f b z
+warn "Using foldl on tuple" = foldl f z (x,y,b) ==> f z b
+warn "Using foldl' on tuple" = foldl' f z (x,y,b) ==> f z b
+warn "Using foldMap on tuple" = foldMap f (x,y,b) ==> f b
+warn "Using foldr1 on tuple" = foldr1 f (x,y,b) ==> b
+warn "Using foldl1 on tuple" = foldl1 f (x,y,b) ==> b
+warn "Using elem on tuple" = elem e (x,y,b) ==> e == b
+warn "Using fold on tuple" = fold (x,y,b) ==> b
+warn "Using toList on tuple" = toList (x,y,b) ==> b
+warn "Using maximum on tuple" = maximum (x,y,b) ==> b
+warn "Using minimum on tuple" = minimum (x,y,b) ==> b
+warn "Using sum on tuple" = sum (x,y,b) ==> b
+warn "Using product on tuple" = product (x,y,b) ==> b
+warn "Using concat on tuple" = concat (x,y,b) ==> b
+warn "Using and on tuple" = and (x,y,b) ==> b
+warn "Using or on tuple" = or (x,y,b) ==> b
+warn "Using any on tuple" = any f (x,y,b) ==> f b
+warn "Using all on tuple" = all f (x,y,b) ==> f b
+
+warn "Using null on tuple" = null x ==> False where _ = isTuple x
+warn "Using length on tuple" = length x ==> 1 where _ = isTuple x
+
-- COMPLEX
{-
@@ -653,6 +698,7 @@
foo = (\a -> Foo {..}) 1
foo = zipWith SymInfo [0 ..] (repeat ty) -- map (\ x -> SymInfo x ty) [0 ..]
f rec = rec
+mean x = fst $ foldl (\(m, n) x' -> (m+(x'-m)/(n+1),n+1)) (0,0) x
import Prelude \
yes = flip mapM -- Control.Monad.forM
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hlint-1.9.28/hlint.cabal new/hlint-1.9.30/hlint.cabal
--- old/hlint-1.9.28/hlint.cabal 2016-02-04 09:55:19.000000000 +0100
+++ new/hlint-1.9.30/hlint.cabal 2016-02-26 21:55:03.000000000 +0100
@@ -1,7 +1,7 @@
cabal-version: >= 1.8
build-type: Simple
name: hlint
-version: 1.9.28
+version: 1.9.30
license: BSD3
license-file: LICENSE
category: Development
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hlint-1.9.28/src/Report.hs new/hlint-1.9.30/src/Report.hs
--- old/hlint-1.9.28/src/Report.hs 2016-02-04 09:55:19.000000000 +0100
+++ new/hlint-1.9.30/src/Report.hs 2016-02-26 21:55:03.000000000 +0100
@@ -4,7 +4,7 @@
import Idea
import Data.Tuple.Extra
-import Data.List
+import Data.List.Extra
import Data.Maybe
import Data.Version
import System.FilePath
@@ -27,9 +27,9 @@
writeReport dataDir file ideas = writeTemplate dataDir inner file
where
generateIds :: [String] -> [(String,Int)] -- sorted by name
- generateIds = map (head &&& length) . group . sort
- files = generateIds $ map (srcSpanFilename . ideaSpan) ideas
- hints = generateIds $ map hintName ideas
+ generateIds = map (head &&& length) . group -- must be already sorted
+ files = generateIds $ sort $ map (srcSpanFilename . ideaSpan) ideas
+ hints = generateIds $ map hintName $ sortOn (negate . fromEnum . ideaSeverity &&& hintName) ideas
hintName x = show (ideaSeverity x) ++ ": " ++ ideaHint x
inner = [("VERSION",['v' : showVersion version]),("CONTENT",content),
1
0
Hello community,
here is the log from the commit of package ghc-base-orphans for openSUSE:Factory checked in at 2016-02-29 09:14:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-base-orphans (Old)
and /work/SRC/openSUSE:Factory/.ghc-base-orphans.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-base-orphans"
Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-base-orphans/ghc-base-orphans.changes 2016-02-11 12:37:24.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.ghc-base-orphans.new/ghc-base-orphans.changes 2016-02-29 09:16:08.000000000 +0100
@@ -1,0 +2,8 @@
+Sun Feb 28 21:35:32 UTC 2016 - mimi.vx(a)gmail.com
+
+- update to 0.5.2
+* Backported Enum, Bounded, Ix, Functor, Applicative, Monad, MonadFix, MonadPlus,
+ MonadZip, Foldable, Traversable, and Data instances for datatypes
+ in the GHC.Generics module (introduced in base-4.9)
+
+-------------------------------------------------------------------
Old:
----
base-orphans-0.5.1.tar.gz
New:
----
base-orphans-0.5.2.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ghc-base-orphans.spec ++++++
--- /var/tmp/diff_new_pack.XRmGNm/_old 2016-02-29 09:16:09.000000000 +0100
+++ /var/tmp/diff_new_pack.XRmGNm/_new 2016-02-29 09:16:09.000000000 +0100
@@ -20,7 +20,7 @@
%bcond_with tests
Name: ghc-base-orphans
-Version: 0.5.1
+Version: 0.5.2
Release: 0
Summary: Backwards-compatible orphan instances for base
Group: System/Libraries
++++++ base-orphans-0.5.1.tar.gz -> base-orphans-0.5.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/base-orphans-0.5.1/CHANGES.markdown new/base-orphans-0.5.2/CHANGES.markdown
--- old/base-orphans-0.5.1/CHANGES.markdown 2016-02-01 23:14:19.000000000 +0100
+++ new/base-orphans-0.5.2/CHANGES.markdown 2016-02-25 17:46:31.000000000 +0100
@@ -1,3 +1,9 @@
+## Changes in 0.5.2
+ - Backported `Enum`, `Bounded`, `Ix`, `Functor`, `Applicative`, `Monad`,
+ `MonadFix`, `MonadPlus`, `MonadZip`, `Foldable`, `Traversable`, and
+ `Data` instances for datatypes in the `GHC.Generics` module (introduced in
+ `base-4.9`)
+
## Changes in 0.5.1
- The `Storable` instances for `Complex` and `Ratio` are now exactly as lazy
as their counterparts in `base` (see issue
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/base-orphans-0.5.1/LICENSE new/base-orphans-0.5.2/LICENSE
--- old/base-orphans-0.5.1/LICENSE 2016-02-01 23:14:19.000000000 +0100
+++ new/base-orphans-0.5.2/LICENSE 2016-02-25 17:46:31.000000000 +0100
@@ -1,4 +1,4 @@
-Copyright (c) 2015 Simon Hengel <sol(a)typeful.net>, João Cristóvão <jmacristovao(a)gmail.com>, Ryan Scott <ryan.gl.scott(a)gmail.com>
+Copyright (c) 2015-2016 Simon Hengel <sol(a)typeful.net>, João Cristóvão <jmacristovao(a)gmail.com>, Ryan Scott <ryan.gl.scott(a)gmail.com>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/base-orphans-0.5.1/base-orphans.cabal new/base-orphans-0.5.2/base-orphans.cabal
--- old/base-orphans-0.5.1/base-orphans.cabal 2016-02-01 23:14:19.000000000 +0100
+++ new/base-orphans-0.5.2/base-orphans.cabal 2016-02-25 17:46:31.000000000 +0100
@@ -1,9 +1,9 @@
--- This file has been generated from package.yaml by hpack version 0.8.0.
+-- This file has been generated from package.yaml by hpack version 0.9.1.
--
-- see: https://github.com/sol/hpack
name: base-orphans
-version: 0.5.1
+version: 0.5.2
synopsis: Backwards-compatible orphan instances for base
description: @base-orphans@ defines orphan instances that mimic instances available in later versions of @base@ to a wider (older) range of compilers. @base-orphans@ does not export anything except the orphan instances themselves and complements @<http://hackage.haskell.org/package/base-compat base-compat>@.
See the README for what instances are covered: <https://github.com/haskell-compat/base-orphans#readme>. See also the <https://github.com/haskell-compat/base-orphans#what-is-not-covered what is not covered> section.
@@ -16,9 +16,9 @@
maintainer: Simon Hengel <sol(a)typeful.net>,
João Cristóvão <jmacristovao(a)gmail.com>,
Ryan Scott <ryan.gl.scott(a)gmail.com>
-copyright: (c) 2012-2015 Simon Hengel,
- (c) 2014 João Cristóvão,
- (c) 2015 Ryan Scott
+copyright: (c) 2012-2016 Simon Hengel,
+ (c) 2014-2016 João Cristóvão,
+ (c) 2015-2016 Ryan Scott
license: MIT
license-file: LICENSE
build-type: Simple
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/base-orphans-0.5.1/src/Data/Orphans/Prelude.hs new/base-orphans-0.5.2/src/Data/Orphans/Prelude.hs
--- old/base-orphans-0.5.1/src/Data/Orphans/Prelude.hs 2016-02-01 23:14:19.000000000 +0100
+++ new/base-orphans-0.5.2/src/Data/Orphans/Prelude.hs 2016-02-25 17:46:31.000000000 +0100
@@ -16,7 +16,7 @@
(module OrphansPrelude, realPart, imagPart) where
import Control.Applicative as OrphansPrelude
-import Control.Arrow as OrphansPrelude hiding (loop)
+import Control.Arrow as OrphansPrelude hiding (first, loop, second)
import Control.Category as OrphansPrelude hiding ((.), id)
import Control.Concurrent.QSem as OrphansPrelude
import Control.Monad as OrphansPrelude hiding (mapM, sequence)
@@ -101,6 +101,7 @@
# endif
# if MIN_VERSION_base(4,8,0)
+import Data.Bifunctor as OrphansPrelude
import Data.Functor.Identity as OrphansPrelude
# endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/base-orphans-0.5.1/src/Data/Orphans.hs new/base-orphans-0.5.2/src/Data/Orphans.hs
--- old/base-orphans-0.5.1/src/Data/Orphans.hs 2016-02-01 23:14:19.000000000 +0100
+++ new/base-orphans-0.5.2/src/Data/Orphans.hs 2016-02-25 17:46:31.000000000 +0100
@@ -36,7 +36,7 @@
import Control.Monad.ST as Strict
#endif
-#if __GLASGOW_HASKELL__ >= 701 && __GLASGOW_HASKELL__ < 710
+#if __GLASGOW_HASKELL__ >= 701 && !(MIN_VERSION_base(4,9,0))
import GHC.Generics as Generics
#endif
@@ -49,6 +49,8 @@
import qualified Data.Foldable as F (Foldable(..))
import Data.Monoid as Monoid
import qualified Data.Traversable as T (Traversable(..))
+import Text.ParserCombinators.ReadPrec as ReadPrec
+import Text.Read as Read
#endif
#if __GLASGOW_HASKELL__ < 710
@@ -57,8 +59,6 @@
import GHC.Exts as Exts
import GHC.IO.Exception as Exception
import Text.ParserCombinators.ReadP as ReadP
-import Text.ParserCombinators.ReadPrec as ReadPrec
-import Text.Read as Read
# if defined(mingw32_HOST_OS)
import GHC.ConsoleHandler as Console
@@ -623,6 +623,198 @@
deriving instance Monoid a => Monoid (Identity a)
deriving instance Storable a => Storable (Identity a)
# endif
+
+# if __GLASGOW_HASKELL__ >= 701
+deriving instance Data p => Data (V1 p)
+deriving instance Data p => Data (U1 p)
+deriving instance Data p => Data (Par1 p)
+deriving instance (Typeable i, Data p, Data c) => Data (K1 i c p)
+deriving instance Data Generics.Fixity
+deriving instance Data Associativity
+
+deriving instance F.Foldable V1
+deriving instance F.Foldable U1
+deriving instance F.Foldable Par1
+deriving instance F.Foldable f => F.Foldable (Rec1 f)
+deriving instance F.Foldable (K1 i c)
+deriving instance F.Foldable f => F.Foldable (M1 i c f)
+deriving instance (F.Foldable f, F.Foldable g) => F.Foldable (f :+: g)
+deriving instance (F.Foldable f, F.Foldable g) => F.Foldable (f :*: g)
+deriving instance (F.Foldable f, F.Foldable g) => F.Foldable (f :.: g)
+
+deriving instance Functor V1
+deriving instance Functor U1
+deriving instance Functor Par1
+deriving instance Functor f => Functor (Rec1 f)
+deriving instance Functor (K1 i c)
+deriving instance Functor f => Functor (M1 i c f)
+deriving instance (Functor f, Functor g) => Functor (f :+: g)
+deriving instance (Functor f, Functor g) => Functor (f :*: g)
+deriving instance (Functor f, Functor g) => Functor (f :.: g)
+
+instance MonadFix Par1 where
+ mfix f = Par1 (fix (unPar1 . f))
+
+instance MonadFix f => MonadFix (Rec1 f) where
+ mfix f = Rec1 (mfix (unRec1 . f))
+
+instance MonadFix f => MonadFix (M1 i c f) where
+ mfix f = M1 (mfix (unM1. f))
+
+instance (MonadFix f, MonadFix g) => MonadFix (f :*: g) where
+ mfix f = (mfix (fstP . f)) :*: (mfix (sndP . f))
+ where
+ fstP (a :*: _) = a
+ sndP (_ :*: b) = b
+
+instance MonadZip Par1 where
+ mzipWith = liftM2
+
+instance MonadZip f => MonadZip (Rec1 f) where
+ mzipWith f (Rec1 fa) (Rec1 fb) = Rec1 (mzipWith f fa fb)
+
+instance MonadZip f => MonadZip (M1 i c f) where
+ mzipWith f (M1 fa) (M1 fb) = M1 (mzipWith f fa fb)
+
+instance (MonadZip f, MonadZip g) => MonadZip (f :*: g) where
+ mzipWith f (x1 :*: y1) (x2 :*: y2) = mzipWith f x1 x2 :*: mzipWith f y1 y2
+
+deriving instance T.Traversable V1
+deriving instance T.Traversable U1
+deriving instance T.Traversable Par1
+deriving instance T.Traversable f => T.Traversable (Rec1 f)
+deriving instance T.Traversable (K1 i c)
+deriving instance T.Traversable f => T.Traversable (M1 i c f)
+deriving instance (T.Traversable f, T.Traversable g) => T.Traversable (f :+: g)
+deriving instance (T.Traversable f, T.Traversable g) => T.Traversable (f :*: g)
+deriving instance (T.Traversable f, T.Traversable g) => T.Traversable (f :.: g)
+
+deriving instance Bounded Associativity
+deriving instance Enum Associativity
+deriving instance Ix Associativity
+
+deriving instance Eq (V1 p)
+deriving instance Ord (V1 p)
+-- Implement Read instance manually to get around an old GHC bug
+-- (Trac #7931)
+instance Read (V1 p) where
+ readPrec = parens ReadPrec.pfail
+ readList = readListDefault
+ readListPrec = readListPrecDefault
+deriving instance Show (V1 p)
+
+instance Applicative U1 where
+ pure _ = U1
+ U1 <*> U1 = U1
+
+instance Alternative U1 where
+ empty = U1
+ U1 <|> U1 = U1
+
+instance Monad U1 where
+# if !(MIN_VERSION_base(4,8,0))
+ return _ = U1
+# endif
+ U1 >>= _ = U1
+
+instance Applicative Par1 where
+ pure a = Par1 a
+ Par1 f <*> Par1 x = Par1 (f x)
+
+instance Monad Par1 where
+# if !(MIN_VERSION_base(4,8,0))
+ return a = Par1 a
+# endif
+ Par1 x >>= f = f x
+
+instance Applicative f => Applicative (Rec1 f) where
+ pure a = Rec1 (pure a)
+ Rec1 f <*> Rec1 x = Rec1 (f <*> x)
+
+instance Alternative f => Alternative (Rec1 f) where
+ empty = Rec1 empty
+ Rec1 l <|> Rec1 r = Rec1 (l <|> r)
+
+instance Monad f => Monad (Rec1 f) where
+# if !(MIN_VERSION_base(4,8,0))
+ return a = Rec1 (return a)
+# endif
+ Rec1 x >>= f = Rec1 (x >>= \a -> unRec1 (f a))
+
+instance MonadPlus f => MonadPlus (Rec1 f) where
+# if !(MIN_VERSION_base(4,8,0))
+ mzero = Rec1 mzero
+ mplus (Rec1 a) (Rec1 b) = Rec1 (mplus a b)
+# endif
+
+instance Applicative f => Applicative (M1 i c f) where
+ pure a = M1 (pure a)
+ M1 f <*> M1 x = M1 (f <*> x)
+
+instance Alternative f => Alternative (M1 i c f) where
+ empty = M1 empty
+ M1 l <|> M1 r = M1 (l <|> r)
+
+instance Monad f => Monad (M1 i c f) where
+# if !(MIN_VERSION_base(4,8,0))
+ return a = M1 (return a)
+# endif
+ M1 x >>= f = M1 (x >>= \a -> unM1 (f a))
+
+instance MonadPlus f => MonadPlus (M1 i c f) where
+# if !(MIN_VERSION_base(4,8,0))
+ mzero = M1 mzero
+ mplus (M1 a) (M1 b) = M1 (mplus a b)
+# endif
+
+instance (Applicative f, Applicative g) => Applicative (f :*: g) where
+ pure a = pure a :*: pure a
+ (f :*: g) <*> (x :*: y) = (f <*> x) :*: (g <*> y)
+
+instance (Alternative f, Alternative g) => Alternative (f :*: g) where
+ empty = empty :*: empty
+ (x1 :*: y1) <|> (x2 :*: y2) = (x1 <|> x2) :*: (y1 <|> y2)
+
+instance (Monad f, Monad g) => Monad (f :*: g) where
+# if !(MIN_VERSION_base(4,8,0))
+ return a = return a :*: return a
+# endif
+ (m :*: n) >>= f = (m >>= \a -> fstP (f a)) :*: (n >>= \a -> sndP (f a))
+ where
+ fstP (a :*: _) = a
+ sndP (_ :*: b) = b
+
+instance (MonadPlus f, MonadPlus g) => MonadPlus (f :*: g) where
+# if !(MIN_VERSION_base(4,8,0))
+ mzero = mzero :*: mzero
+ (x1 :*: y1) `mplus` (x2 :*: y2) = (x1 `mplus` x2) :*: (y1 `mplus` y2)
+# endif
+
+instance (Applicative f, Applicative g) => Applicative (f :.: g) where
+ pure x = Comp1 (pure (pure x))
+ Comp1 f <*> Comp1 x = Comp1 (fmap (<*>) f <*> x)
+
+instance (Alternative f, Applicative g) => Alternative (f :.: g) where
+ empty = Comp1 empty
+ Comp1 x <|> Comp1 y = Comp1 (x <|> y)
+
+# if MIN_VERSION_base(4,7,0)
+deriving instance (Data (f p), Typeable f, Data p) => Data (Rec1 f p)
+deriving instance (Data p, Data (f p), Typeable c, Typeable i, Typeable f)
+ => Data (M1 i c f p)
+deriving instance (Typeable f, Typeable g, Data p, Data (f p), Data (g p))
+ => Data ((f :+: g) p)
+deriving instance (Typeable f, Typeable g, Data p, Data (f p), Data (g p))
+ => Data ((f :*: g) p)
+deriving instance (Typeable f, Typeable g, Data p, Data (f (g p)))
+ => Data ((f :.: g) p)
+# endif
+
+# if MIN_VERSION_base(4,8,0)
+instance Bifunctor (K1 i) where
+ bimap f _ (K1 c) = K1 (f c)
+# endif
+# endif
#endif
#if __GLASGOW_HASKELL__ < 710
1
0
Hello community,
here is the log from the commit of package python3-pip for openSUSE:Factory checked in at 2016-02-29 09:14:31
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python3-pip (Old)
and /work/SRC/openSUSE:Factory/.python3-pip.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python3-pip"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python3-pip/python3-pip.changes 2016-01-26 10:15:19.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.python3-pip.new/python3-pip.changes 2016-02-29 09:16:06.000000000 +0100
@@ -1,0 +2,16 @@
+Sat Feb 27 16:34:29 UTC 2016 - arun(a)gmx.de
+
+- update to version 8.0.3:
+ * Make install --quiet really quiet. See #3418.
+ * Fix a bug when removing packages in python 3: disable INI-style
+ parsing of the entry_point.txt file to allow entry point names
+ with colons (PR #3434)
+ * Normalize generated script files path in RECORD files. (PR #3448)
+ * Fix bug introduced in 8.0.0 where subcommand output was not shown,
+ even when the user specified -v / --verbose. #3486.
+ * Enable python -W with respect to PipDeprecationWarning. (PR #3455)
+ * Upgrade distlib to 0.2.2 (fix #3467):
+ * Improved support for Jython when quoting executables in output
+ scripts.
+
+-------------------------------------------------------------------
Old:
----
pip-8.0.2.tar.gz
New:
----
pip-8.0.3.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python3-pip.spec ++++++
--- /var/tmp/diff_new_pack.w62nE7/_old 2016-02-29 09:16:07.000000000 +0100
+++ /var/tmp/diff_new_pack.w62nE7/_new 2016-02-29 09:16:07.000000000 +0100
@@ -17,7 +17,7 @@
Name: python3-pip
-Version: 8.0.2
+Version: 8.0.3
Release: 0
Url: http://www.pip-installer.org
Summary: Pip installs packages. Python packages. An easy_install replacement
++++++ pip-8.0.2.tar.gz -> pip-8.0.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/CHANGES.txt new/pip-8.0.3/CHANGES.txt
--- old/pip-8.0.2/CHANGES.txt 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/CHANGES.txt 2016-02-25 18:18:32.000000000 +0100
@@ -1,3 +1,22 @@
+**8.0.3 (2016-02-25)**
+
+* Make ``install --quiet`` really quiet. See :issue:`3418`.
+
+* Fix a bug when removing packages in python 3: disable INI-style parsing of the
+ entry_point.txt file to allow entry point names with colons (:pull:`3434`)
+
+* Normalize generated script files path in RECORD files. (:pull:`3448`)
+
+* Fix bug introduced in 8.0.0 where subcommand output was not shown,
+ even when the user specified ``-v`` / ``--verbose``. :issue:`3486`.
+
+* Enable python -W with respect to PipDeprecationWarning. (:pull:`3455`)
+
+* Upgrade distlib to 0.2.2 (fix :issue:`3467`):
+
+ * Improved support for Jython when quoting executables in output scripts.
+
+
**8.0.2 (2016-01-21)**
* Stop attempting to trust the system CA trust store because it's extremely
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/PKG-INFO new/pip-8.0.3/PKG-INFO
--- old/pip-8.0.2/PKG-INFO 2016-01-22 00:49:26.000000000 +0100
+++ new/pip-8.0.3/PKG-INFO 2016-02-25 18:18:39.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: pip
-Version: 8.0.2
+Version: 8.0.3
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/__init__.py new/pip-8.0.3/pip/__init__.py
--- old/pip-8.0.2/pip/__init__.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/__init__.py 2016-02-25 18:18:32.000000000 +0100
@@ -30,7 +30,7 @@
cmdoptions = pip.cmdoptions
# The version as used in the setup.py and the docs conf.py
-__version__ = "8.0.2"
+__version__ = "8.0.3"
logger = logging.getLogger(__name__)
@@ -197,10 +197,6 @@
if args is None:
args = sys.argv[1:]
- # Enable our Deprecation Warnings
- for deprecation_warning in deprecation.DEPRECATIONS:
- warnings.simplefilter("default", deprecation_warning)
-
# Configure our deprecation warnings to be sent through loggers
deprecation.install_warning_logger()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/__init__.py new/pip-8.0.3/pip/_vendor/distlib/__init__.py
--- old/pip-8.0.2/pip/_vendor/distlib/__init__.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/__init__.py 2016-02-25 18:18:32.000000000 +0100
@@ -1,12 +1,12 @@
# -*- coding: utf-8 -*-
#
-# Copyright (C) 2012-2014 Vinay Sajip.
+# Copyright (C) 2012-2016 Vinay Sajip.
# Licensed to the Python Software Foundation under a contributor agreement.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
import logging
-__version__ = '0.2.1'
+__version__ = '0.2.2'
class DistlibException(Exception):
pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/compat.py new/pip-8.0.3/pip/_vendor/distlib/compat.py
--- old/pip-8.0.2/pip/_vendor/distlib/compat.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/compat.py 2016-02-25 18:18:32.000000000 +0100
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#
-# Copyright (C) 2013-2014 Vinay Sajip.
+# Copyright (C) 2013-2016 Vinay Sajip.
# Licensed to the Python Software Foundation under a contributor agreement.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/database.py new/pip-8.0.3/pip/_vendor/distlib/database.py
--- old/pip-8.0.2/pip/_vendor/distlib/database.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/database.py 2016-02-25 18:18:32.000000000 +0100
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#
-# Copyright (C) 2012-2014 The Python Software Foundation.
+# Copyright (C) 2012-2016 The Python Software Foundation.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
"""PEP 376 implementation."""
@@ -20,7 +20,7 @@
from . import DistlibException, resources
from .compat import StringIO
from .version import get_scheme, UnsupportedVersionError
-from .metadata import Metadata, METADATA_FILENAME
+from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME
from .util import (parse_requirement, cached_property, parse_name_and_version,
read_exports, write_exports, CSVReader, CSVWriter)
@@ -132,13 +132,17 @@
if not r or r.path in seen:
continue
if self._include_dist and entry.endswith(DISTINFO_EXT):
- metadata_path = posixpath.join(entry, METADATA_FILENAME)
- pydist = finder.find(metadata_path)
- if not pydist:
+ possible_filenames = [METADATA_FILENAME, WHEEL_METADATA_FILENAME]
+ for metadata_filename in possible_filenames:
+ metadata_path = posixpath.join(entry, metadata_filename)
+ pydist = finder.find(metadata_path)
+ if pydist:
+ break
+ else:
continue
- metadata = Metadata(fileobj=pydist.as_stream(),
- scheme='legacy')
+ with contextlib.closing(pydist.as_stream()) as stream:
+ metadata = Metadata(fileobj=stream, scheme='legacy')
logger.debug('Found %s', r.path)
seen.add(r.path)
yield new_dist_class(r.path, metadata=metadata,
@@ -532,6 +536,9 @@
metadata = env._cache.path[path].metadata
elif metadata is None:
r = finder.find(METADATA_FILENAME)
+ # Temporary - for Wheel 0.23 support
+ if r is None:
+ r = finder.find(WHEEL_METADATA_FILENAME)
# Temporary - for legacy support
if r is None:
r = finder.find('METADATA')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/locators.py new/pip-8.0.3/pip/_vendor/distlib/locators.py
--- old/pip-8.0.2/pip/_vendor/distlib/locators.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/locators.py 2016-02-25 18:18:32.000000000 +0100
@@ -14,7 +14,7 @@
import re
try:
import threading
-except ImportError:
+except ImportError: # pragma: no cover
import dummy_threading as threading
import zlib
@@ -36,7 +36,7 @@
HASHER_HASH = re.compile('^(\w+)=([a-f0-9]+)')
CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I)
HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml')
-DEFAULT_INDEX = 'http://python.org/pypi'
+DEFAULT_INDEX = 'https://pypi.python.org/pypi'
def get_all_distribution_names(url=None):
"""
@@ -354,7 +354,7 @@
else:
logger.debug('skipping pre-release '
'version %s of %s', k, matcher.name)
- except Exception:
+ except Exception: # pragma: no cover
logger.warning('error matching %s with %r', matcher, k)
pass # slist.append(k)
if len(slist) > 1:
@@ -763,18 +763,18 @@
encoding = m.group(1)
try:
data = data.decode(encoding)
- except UnicodeError:
+ except UnicodeError: # pragma: no cover
data = data.decode('latin-1') # fallback
result = Page(data, final_url)
self._page_cache[final_url] = result
except HTTPError as e:
if e.code != 404:
logger.exception('Fetch failed: %s: %s', url, e)
- except URLError as e:
+ except URLError as e: # pragma: no cover
logger.exception('Fetch failed: %s: %s', url, e)
with self._lock:
self._bad_hosts.add(host)
- except Exception as e:
+ except Exception as e: # pragma: no cover
logger.exception('Fetch failed: %s: %s', url, e)
finally:
self._page_cache[url] = result # even if None (failure)
@@ -812,7 +812,7 @@
self.recursive = kwargs.pop('recursive', True)
super(DirectoryLocator, self).__init__(**kwargs)
path = os.path.abspath(path)
- if not os.path.isdir(path):
+ if not os.path.isdir(path): # pragma: no cover
raise DistlibException('Not a directory: %r' % path)
self.base_dir = path
@@ -1083,7 +1083,7 @@
"""
try:
matcher = self.scheme.matcher(reqt)
- except UnsupportedVersionError:
+ except UnsupportedVersionError: # pragma: no cover
# XXX compat-mode if cannot read the version
name = reqt.split()[0]
matcher = self.scheme.matcher(name)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/metadata.py new/pip-8.0.3/pip/_vendor/distlib/metadata.py
--- old/pip-8.0.2/pip/_vendor/distlib/metadata.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/metadata.py 2016-02-25 18:18:32.000000000 +0100
@@ -50,7 +50,8 @@
# to 1.2 once PEP 345 is supported everywhere
PKG_INFO_PREFERRED_VERSION = '1.1'
-_LINE_PREFIX = re.compile('\n \|')
+_LINE_PREFIX_1_2 = re.compile('\n \|')
+_LINE_PREFIX_PRE_1_2 = re.compile('\n ')
_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
'Summary', 'Description',
'Keywords', 'Home-page', 'Author', 'Author-email',
@@ -295,7 +296,10 @@
return 'UNKNOWN'
def _remove_line_prefix(self, value):
- return _LINE_PREFIX.sub('\n', value)
+ if self.metadata_version in ('1.0', '1.1'):
+ return _LINE_PREFIX_PRE_1_2.sub('\n', value)
+ else:
+ return _LINE_PREFIX_1_2.sub('\n', value)
def __getattr__(self, name):
if name in _ATTR2FIELD:
@@ -374,7 +378,10 @@
continue
if field not in _LISTFIELDS:
if field == 'Description':
- values = values.replace('\n', '\n |')
+ if self.metadata_version in ('1.0', '1.1'):
+ values = values.replace('\n', '\n ')
+ else:
+ values = values.replace('\n', '\n |')
values = [values]
if field in _LISTTUPLEFIELDS:
@@ -548,7 +555,7 @@
('description', 'Description'),
('keywords', 'Keywords'),
('platform', 'Platform'),
- ('classifier', 'Classifier'),
+ ('classifiers', 'Classifier'),
('download_url', 'Download-URL'),
)
@@ -617,6 +624,7 @@
METADATA_FILENAME = 'pydist.json'
+WHEEL_METADATA_FILENAME = 'metadata.json'
class Metadata(object):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/resources.py new/pip-8.0.3/pip/_vendor/distlib/resources.py
--- old/pip-8.0.2/pip/_vendor/distlib/resources.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/resources.py 2016-02-25 18:18:32.000000000 +0100
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#
-# Copyright (C) 2013 Vinay Sajip.
+# Copyright (C) 2013-2016 Vinay Sajip.
# Licensed to the Python Software Foundation under a contributor agreement.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/scripts.py new/pip-8.0.3/pip/_vendor/distlib/scripts.py
--- old/pip-8.0.2/pip/_vendor/distlib/scripts.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/scripts.py 2016-02-25 18:18:32.000000000 +0100
@@ -63,6 +63,22 @@
'''
+def _enquote_executable(executable):
+ if ' ' in executable:
+ # make sure we quote only the executable in case of env
+ # for example /usr/bin/env "/dir with spaces/bin/jython"
+ # instead of "/usr/bin/env /dir with spaces/bin/jython"
+ # otherwise whole
+ if executable.startswith('/usr/bin/env '):
+ env, _executable = executable.split(' ', 1)
+ if ' ' in _executable and not _executable.startswith('"'):
+ executable = '%s "%s"' % (env, _executable)
+ else:
+ if not executable.startswith('"'):
+ executable = '"%s"' % executable
+ return executable
+
+
class ScriptMaker(object):
"""
A class to copy or create scripts from source scripts or callable
@@ -85,8 +101,11 @@
self.variants = set(('', 'X.Y'))
self._fileop = fileop or FileOperator(dry_run)
+ self._is_nt = os.name == 'nt' or (
+ os.name == 'java' and os._name == 'nt')
+
def _get_alternate_executable(self, executable, options):
- if options.get('gui', False) and os.name == 'nt':
+ if options.get('gui', False) and self._is_nt: # pragma: no cover
dn, fn = os.path.split(executable)
fn = fn.replace('python', 'pythonw')
executable = os.path.join(dn, fn)
@@ -124,10 +143,10 @@
enquote = False # assume this will be taken care of
elif not sysconfig.is_python_build():
executable = get_executable()
- elif in_venv():
+ elif in_venv(): # pragma: no cover
executable = os.path.join(sysconfig.get_path('scripts'),
'python%s' % sysconfig.get_config_var('EXE'))
- else:
+ else: # pragma: no cover
executable = os.path.join(
sysconfig.get_config_var('BINDIR'),
'python%s%s' % (sysconfig.get_config_var('VERSION'),
@@ -141,14 +160,14 @@
executable = os.path.normcase(executable)
# If the user didn't specify an executable, it may be necessary to
# cater for executable paths with spaces (not uncommon on Windows)
- if enquote and ' ' in executable:
- executable = '"%s"' % executable
+ if enquote:
+ executable = _enquote_executable(executable)
# Issue #51: don't use fsencode, since we later try to
# check that the shebang is decodable using utf-8.
executable = executable.encode('utf-8')
# in case of IronPython, play safe and enable frames support
if (sys.platform == 'cli' and '-X:Frames' not in post_interp
- and '-X:FullFrames' not in post_interp):
+ and '-X:FullFrames' not in post_interp): # pragma: no cover
post_interp += b' -X:Frames'
shebang = b'#!' + executable + post_interp + b'\n'
# Python parser starts to read a script using UTF-8 until
@@ -158,7 +177,7 @@
# UTF-8.
try:
shebang.decode('utf-8')
- except UnicodeDecodeError:
+ except UnicodeDecodeError: # pragma: no cover
raise ValueError(
'The shebang (%r) is not decodable from utf-8' % shebang)
# If the script is encoded to a custom encoding (use a
@@ -167,7 +186,7 @@
if encoding != 'utf-8':
try:
shebang.decode(encoding)
- except UnicodeDecodeError:
+ except UnicodeDecodeError: # pragma: no cover
raise ValueError(
'The shebang (%r) is not decodable '
'from the script encoding (%r)' % (shebang, encoding))
@@ -184,11 +203,11 @@
return self.manifest % base
def _write_script(self, names, shebang, script_bytes, filenames, ext):
- use_launcher = self.add_launchers and os.name == 'nt'
+ use_launcher = self.add_launchers and self._is_nt
linesep = os.linesep.encode('utf-8')
if not use_launcher:
script_bytes = shebang + linesep + script_bytes
- else:
+ else: # pragma: no cover
if ext == 'py':
launcher = self._get_launcher('t')
else:
@@ -200,7 +219,7 @@
script_bytes = launcher + shebang + linesep + zip_data
for name in names:
outname = os.path.join(self.target_dir, name)
- if use_launcher:
+ if use_launcher: # pragma: no cover
n, e = os.path.splitext(outname)
if e.startswith('.py'):
outname = n
@@ -223,7 +242,7 @@
except Exception:
pass # still in use - ignore error
else:
- if os.name == 'nt' and not outname.endswith('.' + ext):
+ if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover
outname = '%s.%s' % (outname, ext)
if os.path.exists(outname) and not self.clobber:
logger.warning('Skipping existing file %s', outname)
@@ -269,15 +288,13 @@
# script.
try:
f = open(script, 'rb')
- except IOError:
+ except IOError: # pragma: no cover
if not self.dry_run:
raise
f = None
else:
- encoding, lines = detect_encoding(f.readline)
- f.seek(0)
first_line = f.readline()
- if not first_line:
+ if not first_line: # pragma: no cover
logger.warning('%s: %s is an empty file (skipping)',
self.get_command_name(), script)
return
@@ -298,8 +315,10 @@
logger.info('copying and adjusting %s -> %s', script,
self.target_dir)
if not self._fileop.dry_run:
+ encoding, lines = detect_encoding(f.readline)
+ f.seek(0)
shebang = self._get_shebang(encoding, post_interp)
- if b'pythonw' in first_line:
+ if b'pythonw' in first_line: # pragma: no cover
ext = 'pyw'
else:
ext = 'py'
@@ -316,7 +335,7 @@
def dry_run(self, value):
self._fileop.dry_run = value
- if os.name == 'nt':
+ if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover
# Executable launcher support.
# Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/util.py new/pip-8.0.3/pip/_vendor/distlib/util.py
--- old/pip-8.0.2/pip/_vendor/distlib/util.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/util.py 2016-02-25 18:18:32.000000000 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (C) 2012-2014 The Python Software Foundation.
+# Copyright (C) 2012-2016 The Python Software Foundation.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
import codecs
@@ -20,6 +20,8 @@
import sys
import tarfile
import tempfile
+import textwrap
+
try:
import threading
except ImportError:
@@ -28,8 +30,8 @@
from . import DistlibException
from .compat import (string_types, text_type, shutil, raw_input, StringIO,
- cache_from_source, urlopen, httplib, xmlrpclib, splittype,
- HTTPHandler, HTTPSHandler as BaseHTTPSHandler,
+ cache_from_source, urlopen, urljoin, httplib, xmlrpclib,
+ splittype, HTTPHandler, HTTPSHandler as BaseHTTPSHandler,
BaseConfigurator, valid_ident, Container, configparser,
URLError, match_hostname, CertificateError, ZipFile)
@@ -199,8 +201,8 @@
data = stream.read()
stream = StringIO(data)
try:
- data = json.load(stream)
- result = data['extensions']['python.exports']['exports']
+ jdata = json.load(stream)
+ result = jdata['extensions']['python.exports']['exports']
for group, entries in result.items():
for k, v in entries.items():
s = '%s = %s' % (k, v)
@@ -210,11 +212,22 @@
return result
except Exception:
stream.seek(0, 0)
+
+ def read_stream(cp, stream):
+ if hasattr(cp, 'read_file'):
+ cp.read_file(stream)
+ else:
+ cp.readfp(stream)
+
cp = configparser.ConfigParser()
- if hasattr(cp, 'read_file'):
- cp.read_file(stream)
- else:
- cp.readfp(stream)
+ try:
+ read_stream(cp, stream)
+ except configparser.MissingSectionHeaderError:
+ stream.close()
+ data = textwrap.dedent(data)
+ stream = StringIO(data)
+ read_stream(cp, stream)
+
result = {}
for key in cp.sections():
result[key] = entries = {}
@@ -758,16 +771,17 @@
logger.exception('Failed to get external data for %s: %s', url, e)
return result
+_external_data_base_url = 'https://www.red-dove.com/pypi/projects/'
def get_project_data(name):
- url = ('https://www.red-dove.com/pypi/projects/'
- '%s/%s/project.json' % (name[0].upper(), name))
+ url = '%s/%s/project.json' % (name[0].upper(), name)
+ url = urljoin(_external_data_base_url, url)
result = _get_external_data(url)
return result
def get_package_data(name, version):
- url = ('https://www.red-dove.com/pypi/projects/'
- '%s/%s/package-%s.json' % (name[0].upper(), name, version))
+ url = '%s/%s/package-%s.json' % (name[0].upper(), name, version)
+ url = urljoin(_external_data_base_url, url)
return _get_external_data(url)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/version.py new/pip-8.0.3/pip/_vendor/distlib/version.py
--- old/pip-8.0.2/pip/_vendor/distlib/version.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/version.py 2016-02-25 18:18:32.000000000 +0100
@@ -1,11 +1,11 @@
# -*- coding: utf-8 -*-
#
-# Copyright (C) 2012-2014 The Python Software Foundation.
+# Copyright (C) 2012-2016 The Python Software Foundation.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
"""
-Implementation of a flexible versioning scheme providing support for PEP-386,
-distribute-compatible and semantic versioning.
+Implementation of a flexible versioning scheme providing support for PEP-440,
+setuptools-compatible and semantic versioning.
"""
import logging
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/wheel.py new/pip-8.0.3/pip/_vendor/distlib/wheel.py
--- old/pip-8.0.2/pip/_vendor/distlib/wheel.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/wheel.py 2016-02-25 18:18:32.000000000 +0100
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#
-# Copyright (C) 2013-2014 Vinay Sajip.
+# Copyright (C) 2013-2016 Vinay Sajip.
# Licensed to the Python Software Foundation under a contributor agreement.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/vendor.txt new/pip-8.0.3/pip/_vendor/vendor.txt
--- old/pip-8.0.2/pip/_vendor/vendor.txt 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/vendor.txt 2016-02-25 18:18:32.000000000 +0100
@@ -1,4 +1,4 @@
-distlib==0.2.1
+distlib==0.2.2
html5lib==1.0b8
six==1.10.0
colorama==0.3.6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/index.py new/pip-8.0.3/pip/index.py
--- old/pip-8.0.2/pip/index.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/index.py 2016-02-25 18:18:32.000000000 +0100
@@ -19,7 +19,7 @@
from pip.utils import (
cached_property, splitext, normalize_path,
ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, canonicalize_name)
-from pip.utils.deprecation import RemovedInPip9Warning
+from pip.utils.deprecation import RemovedInPip9Warning, RemovedInPip10Warning
from pip.utils.logging import indent_log
from pip.exceptions import (
DistributionNotFound, BestVersionAlreadyInstalled, InvalidWheelFilename,
@@ -1019,7 +1019,7 @@
fmt_ctl_no_binary(fmt_ctl)
warnings.warn(
'--no-use-wheel is deprecated and will be removed in the future. '
- ' Please use --no-binary :all: instead.', DeprecationWarning,
+ ' Please use --no-binary :all: instead.', RemovedInPip10Warning,
stacklevel=2)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/req/req_install.py new/pip-8.0.3/pip/req/req_install.py
--- old/pip-8.0.2/pip/req/req_install.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/req/req_install.py 2016-02-25 18:18:32.000000000 +0100
@@ -727,7 +727,11 @@
# find console_scripts
if dist.has_metadata('entry_points.txt'):
- config = configparser.SafeConfigParser()
+ if six.PY2:
+ options = {}
+ else:
+ options = {"delimiters": ('=', )}
+ config = configparser.SafeConfigParser(**options)
config.readfp(
FakeFile(dist.get_metadata_lines('entry_points.txt'))
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/utils/__init__.py new/pip-8.0.3/pip/utils/__init__.py
--- old/pip-8.0.2/pip/utils/__init__.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/utils/__init__.py 2016-02-25 18:18:32.000000000 +0100
@@ -635,6 +635,31 @@
on_returncode='raise',
command_level=std_logging.DEBUG, command_desc=None,
extra_environ=None, spinner=None):
+ # This function's handling of subprocess output is confusing and I
+ # previously broke it terribly, so as penance I will write a long comment
+ # explaining things.
+ #
+ # The obvious thing that affects output is the show_stdout=
+ # kwarg. show_stdout=True means, let the subprocess write directly to our
+ # stdout. Even though it is nominally the default, it is almost never used
+ # inside pip (and should not be used in new code without a very good
+ # reason); as of 2016-02-22 it is only used in a few places inside the VCS
+ # wrapper code. Ideally we should get rid of it entirely, because it
+ # creates a lot of complexity here for a rarely used feature.
+ #
+ # Most places in pip set show_stdout=False. What this means is:
+ # - We connect the child stdout to a pipe, which we read.
+ # - By default, we hide the output but show a spinner -- unless the
+ # subprocess exits with an error, in which case we show the output.
+ # - If the --verbose option was passed (= loglevel is DEBUG), then we show
+ # the output unconditionally. (But in this case we don't want to show
+ # the output a second time if it turns out that there was an error.)
+ #
+ # stderr is always merged with stdout (even if show_stdout=True).
+ if show_stdout:
+ stdout = None
+ else:
+ stdout = subprocess.PIPE
if command_desc is None:
cmd_parts = []
for part in cmd:
@@ -648,24 +673,28 @@
env.update(extra_environ)
try:
proc = subprocess.Popen(
- cmd, stderr=subprocess.STDOUT, stdin=None, stdout=subprocess.PIPE,
+ cmd, stderr=subprocess.STDOUT, stdin=None, stdout=stdout,
cwd=cwd, env=env)
except Exception as exc:
logger.critical(
"Error %s while executing command %s", exc, command_desc,
)
raise
- all_output = []
- while True:
- line = console_to_str(proc.stdout.readline())
- if not line:
- break
- line = line.rstrip()
- all_output.append(line + '\n')
- if show_stdout:
- logger.debug(line)
- if spinner is not None:
- spinner.spin()
+ if stdout is not None:
+ all_output = []
+ while True:
+ line = console_to_str(proc.stdout.readline())
+ if not line:
+ break
+ line = line.rstrip()
+ all_output.append(line + '\n')
+ if logger.getEffectiveLevel() <= std_logging.DEBUG:
+ # Show the line immediately
+ logger.debug(line)
+ else:
+ # Update the spinner
+ if spinner is not None:
+ spinner.spin()
proc.wait()
if spinner is not None:
if proc.returncode:
@@ -674,7 +703,7 @@
spinner.finish("done")
if proc.returncode:
if on_returncode == 'raise':
- if all_output:
+ if logger.getEffectiveLevel() > std_logging.DEBUG:
logger.info(
'Complete output from command %s:', command_desc,
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/utils/deprecation.py new/pip-8.0.3/pip/utils/deprecation.py
--- old/pip-8.0.2/pip/utils/deprecation.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/utils/deprecation.py 2016-02-25 18:18:32.000000000 +0100
@@ -11,23 +11,20 @@
pass
-class RemovedInPip9Warning(PipDeprecationWarning, DeprecationWarning):
+class Pending(object):
pass
-class RemovedInPip10Warning(PipDeprecationWarning, PendingDeprecationWarning):
+class RemovedInPip9Warning(PipDeprecationWarning):
pass
-class Python26DeprecationWarning(
- PipDeprecationWarning, PendingDeprecationWarning
-):
+class RemovedInPip10Warning(PipDeprecationWarning, Pending):
pass
-DEPRECATIONS = [
- RemovedInPip9Warning, RemovedInPip10Warning, Python26DeprecationWarning
-]
+class Python26DeprecationWarning(PipDeprecationWarning, Pending):
+ pass
# Warnings <-> Logging Integration
@@ -53,15 +50,15 @@
# want it to appear as if someone typed this entire message out.
log_message = "DEPRECATION: %s" % message
- # Things that are DeprecationWarnings will be removed in the very
- # next version of pip. We want these to be more obvious so we
- # use the ERROR logging level while the PendingDeprecationWarnings
- # are still have at least 2 versions to go until they are removed
- # so they can just be warnings.
- if issubclass(category, DeprecationWarning):
- logger.error(log_message)
- else:
+ # PipDeprecationWarnings that are Pending still have at least 2
+ # versions to go until they are removed so they can just be
+ # warnings. Otherwise, they will be removed in the very next
+ # version of pip. We want these to be more obvious so we use the
+ # ERROR logging level.
+ if issubclass(category, Pending):
logger.warning(log_message)
+ else:
+ logger.error(log_message)
else:
_warnings_showwarning(
message, category, filename, lineno, file, line,
@@ -69,6 +66,9 @@
def install_warning_logger():
+ # Enable our Deprecation Warnings
+ warnings.simplefilter("default", PipDeprecationWarning, append=True)
+
global _warnings_showwarning
if _warnings_showwarning is None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/utils/ui.py new/pip-8.0.3/pip/utils/ui.py
--- old/pip-8.0.2/pip/utils/ui.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/utils/ui.py 2016-02-25 18:18:32.000000000 +0100
@@ -219,6 +219,11 @@
# even via colorama. So don't even try.
if WINDOWS:
yield
+ # We don't want to clutter the output with control characters if we're
+ # writing to a file, or if the user is running with --quiet.
+ # See https://github.com/pypa/pip/issues/3418
+ elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO:
+ yield
else:
file.write(HIDE_CURSOR)
try:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip/wheel.py new/pip-8.0.3/pip/wheel.py
--- old/pip-8.0.2/pip/wheel.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/wheel.py 2016-02-25 18:18:32.000000000 +0100
@@ -519,7 +519,7 @@
writer.writerow(row)
for f in generated:
h, l = rehash(f)
- writer.writerow((f, h, l))
+ writer.writerow((normpath(f, lib_dir), h, l))
for f in installed:
writer.writerow((installed[f], '', ''))
shutil.move(temp_record, record)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip.egg-info/PKG-INFO new/pip-8.0.3/pip.egg-info/PKG-INFO
--- old/pip-8.0.2/pip.egg-info/PKG-INFO 2016-01-22 00:49:24.000000000 +0100
+++ new/pip-8.0.3/pip.egg-info/PKG-INFO 2016-02-25 18:18:37.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: pip
-Version: 8.0.2
+Version: 8.0.3
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/pip.egg-info/requires.txt new/pip-8.0.3/pip.egg-info/requires.txt
--- old/pip-8.0.2/pip.egg-info/requires.txt 2016-01-22 00:49:24.000000000 +0100
+++ new/pip-8.0.3/pip.egg-info/requires.txt 2016-02-25 18:18:37.000000000 +0100
@@ -4,3 +4,4 @@
virtualenv>=1.10
scripttest>=1.3
mock
+pretend
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/setup.cfg new/pip-8.0.3/setup.cfg
--- old/pip-8.0.2/setup.cfg 2016-01-22 00:49:26.000000000 +0100
+++ new/pip-8.0.3/setup.cfg 2016-02-25 18:18:39.000000000 +0100
@@ -5,7 +5,7 @@
universal = 1
[egg_info]
-tag_date = 0
-tag_build =
tag_svn_revision = 0
+tag_build =
+tag_date = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-8.0.2/setup.py new/pip-8.0.3/setup.py
--- old/pip-8.0.2/setup.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/setup.py 2016-02-25 18:18:32.000000000 +0100
@@ -41,7 +41,8 @@
long_description = read('README.rst')
-tests_require = ['pytest', 'virtualenv>=1.10', 'scripttest>=1.3', 'mock']
+tests_require = ['pytest', 'virtualenv>=1.10', 'scripttest>=1.3', 'mock',
+ 'pretend']
setup(
1
0
Hello community,
here is the log from the commit of package python3-autopep8 for openSUSE:Factory checked in at 2016-02-29 09:14:25
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python3-autopep8 (Old)
and /work/SRC/openSUSE:Factory/.python3-autopep8.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python3-autopep8"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python3-autopep8/python3-autopep8.changes 2015-10-20 00:04:26.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python3-autopep8.new/python3-autopep8.changes 2016-02-29 09:16:04.000000000 +0100
@@ -1,0 +2,22 @@
+Sat Feb 27 16:21:20 UTC 2016 - arun(a)gmx.de
+
+- specfile:
+ * update copyright year
+
+- update to version 1.2.2:
+ * Point to new URL
+ * Simplify
+ * Fix broken link
+ * Put constant on right
+ * Disable some checks for now
+ * Use consistent type
+ * Use enumerate rather than range and len
+ * Put constant on right side
+ * Simplify
+ * Handle "-OO" mode
+ * Support "noqa" for E265
+ * Suppress option that is not recommended
+ * Avoid infinite loop upon an invalid code input
+ * Suppress false positive
+
+-------------------------------------------------------------------
Old:
----
autopep8-1.2.1.tar.gz
New:
----
autopep8-1.2.2.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python3-autopep8.spec ++++++
--- /var/tmp/diff_new_pack.pL72ax/_old 2016-02-29 09:16:05.000000000 +0100
+++ /var/tmp/diff_new_pack.pL72ax/_new 2016-02-29 09:16:05.000000000 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python3-autopep8
#
-# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
Name: python3-autopep8
-Version: 1.2.1
+Version: 1.2.2
Release: 0
Url: https://github.com/hhatto/autopep8
Summary: Automatic generated to pep8 checked code
++++++ autopep8-1.2.1.tar.gz -> autopep8-1.2.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/autopep8-1.2.1/PKG-INFO new/autopep8-1.2.2/PKG-INFO
--- old/autopep8-1.2.1/PKG-INFO 2015-09-20 03:30:39.000000000 +0200
+++ new/autopep8-1.2.2/PKG-INFO 2016-02-25 07:27:59.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: autopep8
-Version: 1.2.1
+Version: 1.2.2
Summary: A tool that automatically formats Python code to conform to the PEP 8 style guide
Home-page: https://github.com/hhatto/autopep8
Author: Hideo Hattori
@@ -19,7 +19,7 @@
be formatted. autopep8 is capable of fixing most of the formatting issues_ that
can be reported by pep8.
- .. _PEP 8: http://www.python.org/dev/peps/pep-0008/
+ .. _PEP 8: https://www.python.org/dev/peps/pep-0008/
.. _issues: https://pep8.readthedocs.org/en/latest/intro.html#error-codes
.. contents::
@@ -34,7 +34,7 @@
Consider using the ``--user`` option_.
- .. _option: https://pip.readthedocs.org/en/latest/user_guide.html#user-installs
+ .. _option: https://pip.pypa.io/en/latest/user_guide/#user-installs
Requirements
@@ -42,7 +42,7 @@
autopep8 requires pep8_.
- .. _pep8: https://github.com/PyCQA/pep8
+ .. _pep8: https://github.com/PyCQA/pycodestyle
Usage
@@ -135,7 +135,7 @@
[--ignore-local-config] [-r] [-j n] [-p n] [-a]
[--experimental] [--exclude globs] [--list-fixes]
[--ignore errors] [--select errors] [--max-line-length n]
- [--line-range line line] [--indent-size n]
+ [--line-range line line]
[files [files ...]]
Automatically formats Python code to conform to the PEP 8 style guide.
@@ -178,7 +178,6 @@
only fix errors found within this inclusive range of
line numbers (e.g. 1 99); line numbers are indexed at
1
- --indent-size n number of spaces per indent level (default 4)
Features
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/autopep8-1.2.1/README.rst new/autopep8-1.2.2/README.rst
--- old/autopep8-1.2.1/README.rst 2015-09-20 03:27:50.000000000 +0200
+++ new/autopep8-1.2.2/README.rst 2016-02-25 07:21:42.000000000 +0100
@@ -11,7 +11,7 @@
be formatted. autopep8 is capable of fixing most of the formatting issues_ that
can be reported by pep8.
-.. _PEP 8: http://www.python.org/dev/peps/pep-0008/
+.. _PEP 8: https://www.python.org/dev/peps/pep-0008/
.. _issues: https://pep8.readthedocs.org/en/latest/intro.html#error-codes
.. contents::
@@ -26,7 +26,7 @@
Consider using the ``--user`` option_.
-.. _option: https://pip.readthedocs.org/en/latest/user_guide.html#user-installs
+.. _option: https://pip.pypa.io/en/latest/user_guide/#user-installs
Requirements
@@ -34,7 +34,7 @@
autopep8 requires pep8_.
-.. _pep8: https://github.com/PyCQA/pep8
+.. _pep8: https://github.com/PyCQA/pycodestyle
Usage
@@ -127,7 +127,7 @@
[--ignore-local-config] [-r] [-j n] [-p n] [-a]
[--experimental] [--exclude globs] [--list-fixes]
[--ignore errors] [--select errors] [--max-line-length n]
- [--line-range line line] [--indent-size n]
+ [--line-range line line]
[files [files ...]]
Automatically formats Python code to conform to the PEP 8 style guide.
@@ -170,7 +170,6 @@
only fix errors found within this inclusive range of
line numbers (e.g. 1 99); line numbers are indexed at
1
- --indent-size n number of spaces per indent level (default 4)
Features
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/autopep8-1.2.1/autopep8.egg-info/PKG-INFO new/autopep8-1.2.2/autopep8.egg-info/PKG-INFO
--- old/autopep8-1.2.1/autopep8.egg-info/PKG-INFO 2015-09-20 03:30:39.000000000 +0200
+++ new/autopep8-1.2.2/autopep8.egg-info/PKG-INFO 2016-02-25 07:27:59.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: autopep8
-Version: 1.2.1
+Version: 1.2.2
Summary: A tool that automatically formats Python code to conform to the PEP 8 style guide
Home-page: https://github.com/hhatto/autopep8
Author: Hideo Hattori
@@ -19,7 +19,7 @@
be formatted. autopep8 is capable of fixing most of the formatting issues_ that
can be reported by pep8.
- .. _PEP 8: http://www.python.org/dev/peps/pep-0008/
+ .. _PEP 8: https://www.python.org/dev/peps/pep-0008/
.. _issues: https://pep8.readthedocs.org/en/latest/intro.html#error-codes
.. contents::
@@ -34,7 +34,7 @@
Consider using the ``--user`` option_.
- .. _option: https://pip.readthedocs.org/en/latest/user_guide.html#user-installs
+ .. _option: https://pip.pypa.io/en/latest/user_guide/#user-installs
Requirements
@@ -42,7 +42,7 @@
autopep8 requires pep8_.
- .. _pep8: https://github.com/PyCQA/pep8
+ .. _pep8: https://github.com/PyCQA/pycodestyle
Usage
@@ -135,7 +135,7 @@
[--ignore-local-config] [-r] [-j n] [-p n] [-a]
[--experimental] [--exclude globs] [--list-fixes]
[--ignore errors] [--select errors] [--max-line-length n]
- [--line-range line line] [--indent-size n]
+ [--line-range line line]
[files [files ...]]
Automatically formats Python code to conform to the PEP 8 style guide.
@@ -178,7 +178,6 @@
only fix errors found within this inclusive range of
line numbers (e.g. 1 99); line numbers are indexed at
1
- --indent-size n number of spaces per indent level (default 4)
Features
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/autopep8-1.2.1/autopep8.egg-info/SOURCES.txt new/autopep8-1.2.2/autopep8.egg-info/SOURCES.txt
--- old/autopep8-1.2.1/autopep8.egg-info/SOURCES.txt 2015-09-20 03:30:39.000000000 +0200
+++ new/autopep8-1.2.2/autopep8.egg-info/SOURCES.txt 2016-02-25 07:27:59.000000000 +0100
@@ -9,7 +9,6 @@
autopep8.egg-info/dependency_links.txt
autopep8.egg-info/entry_points.txt
autopep8.egg-info/not-zip-safe
-autopep8.egg-info/pbr.json
autopep8.egg-info/requires.txt
autopep8.egg-info/top_level.txt
test/__init__.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/autopep8-1.2.1/autopep8.egg-info/pbr.json new/autopep8-1.2.2/autopep8.egg-info/pbr.json
--- old/autopep8-1.2.1/autopep8.egg-info/pbr.json 2015-09-20 03:30:39.000000000 +0200
+++ new/autopep8-1.2.2/autopep8.egg-info/pbr.json 1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-{"is_release": false, "git_version": "064354f"}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/autopep8-1.2.1/autopep8.py new/autopep8-1.2.2/autopep8.py
--- old/autopep8-1.2.1/autopep8.py 2015-09-20 03:29:39.000000000 +0200
+++ new/autopep8-1.2.2/autopep8.py 2016-02-25 07:26:47.000000000 +0100
@@ -66,7 +66,7 @@
unicode = str
-__version__ = '1.2.1'
+__version__ = '1.2.2'
CR = '\r'
@@ -652,7 +652,7 @@
line_index = result['line'] - 1
target = self.source[line_index]
offset = result['column']
- fixed = target[:offset] + ' ' + target[offset:]
+ fixed = target[:offset].rstrip() + ' ' + target[offset:].lstrip()
self.source[line_index] = fixed
def fix_e251(self, result):
@@ -891,9 +891,9 @@
second = (_get_indentation(logical_lines[0]) +
target[offset:].lstrip(';').lstrip())
- # find inline commnet
+ # Find inline comment.
inline_comment = None
- if '# ' == target[offset:].lstrip(';').lstrip()[:2]:
+ if target[offset:].lstrip(';').lstrip()[:2] == '# ':
inline_comment = target[offset:].lstrip(';')
if inline_comment:
@@ -1166,7 +1166,7 @@
if len(split_a) != len(split_b):
return False
- for index in range(len(split_a)):
+ for (index, _) in enumerate(split_a):
if ''.join(split_a[index].split()) != ''.join(split_b[index].split()):
return False
@@ -1197,7 +1197,8 @@
for (line_number, line) in enumerate(sio.readlines(), start=1):
if (
line.lstrip().startswith('#') and
- line_number not in ignored_line_numbers
+ line_number not in ignored_line_numbers and
+ not pep8.noqa(line)
):
indentation = _get_indentation(line)
line = line.lstrip()
@@ -2996,6 +2997,7 @@
def _get_parameters(function):
+ # pylint: disable=deprecated-method
if sys.version_info >= (3, 3):
# We need to match "getargspec()", which includes "self" as the first
# value for methods.
@@ -3117,9 +3119,7 @@
'range of line numbers (e.g. 1 99); '
'line numbers are indexed at 1')
parser.add_argument('--indent-size', default=DEFAULT_INDENT_SIZE,
- type=int, metavar='n',
- help='number of spaces per indent level '
- '(default %(default)s)')
+ type=int, help=argparse.SUPPRESS)
parser.add_argument('files', nargs='*',
help="files to format or '-' for standard in")
@@ -3176,14 +3176,14 @@
elif not args.select:
if args.aggressive:
# Enable everything by default if aggressive.
- args.select = ['E', 'W']
+ args.select = set(['E', 'W'])
else:
args.ignore = _split_comma_separated(DEFAULT_IGNORE)
if args.exclude:
args.exclude = _split_comma_separated(args.exclude)
else:
- args.exclude = []
+ args.exclude = set([])
if args.jobs < 1:
# Do not import multiprocessing globally in case it is not supported
@@ -3280,7 +3280,7 @@
def docstring_summary(docstring):
"""Return summary of docstring."""
- return docstring.split('\n')[0]
+ return docstring.split('\n')[0] if docstring else ''
def line_shortening_rank(candidate, indent_word, max_line_length,
1
0
Hello community,
here is the log from the commit of package python3-mistune for openSUSE:Factory checked in at 2016-02-29 09:14:17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python3-mistune (Old)
and /work/SRC/openSUSE:Factory/.python3-mistune.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python3-mistune"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python3-mistune/python3-mistune.changes 2015-10-20 00:06:51.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python3-mistune.new/python3-mistune.changes 2016-02-29 09:16:01.000000000 +0100
@@ -1,0 +2,12 @@
+Sat Feb 27 16:33:51 UTC 2016 - arun(a)gmx.de
+
+- specfile:
+ * update copyright year
+
+- update to version 0.7.2:
+ * Fix hard_wrap options on renderer.
+ * Fix emphasis regex pattern
+ * Fix base64 image link #80.
+ * Fix link security per #87.
+
+-------------------------------------------------------------------
Old:
----
mistune-0.7.1.tar.gz
New:
----
mistune-0.7.2.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python3-mistune.spec ++++++
--- /var/tmp/diff_new_pack.lXnUoR/_old 2016-02-29 09:16:03.000000000 +0100
+++ /var/tmp/diff_new_pack.lXnUoR/_new 2016-02-29 09:16:03.000000000 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python3-mistune
#
-# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
Name: python3-mistune
-Version: 0.7.1
+Version: 0.7.2
Release: 0
Summary: The fastest markdown parser in pure Python
License: BSD-3-Clause
++++++ mistune-0.7.1.tar.gz -> mistune-0.7.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mistune-0.7.1/CHANGES.rst new/mistune-0.7.2/CHANGES.rst
--- old/mistune-0.7.1/CHANGES.rst 2015-08-22 17:28:24.000000000 +0200
+++ new/mistune-0.7.2/CHANGES.rst 2016-02-26 02:41:10.000000000 +0100
@@ -3,6 +3,18 @@
Here is the full history of mistune.
+Version 0.7.2
+~~~~~~~~~~~~~
+
+* Fix `hard_wrap` options on renderer.
+* Fix emphasis regex pattern
+* Fix base64 image link `#80`_.
+* Fix link security per `#87`_.
+
+.. _`#80`: https://github.com/lepture/mistune/issues/80
+.. _`#87`: https://github.com/lepture/mistune/issues/87
+
+
Version 0.7.1
~~~~~~~~~~~~~
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mistune-0.7.1/PKG-INFO new/mistune-0.7.2/PKG-INFO
--- old/mistune-0.7.1/PKG-INFO 2015-08-22 17:44:33.000000000 +0200
+++ new/mistune-0.7.2/PKG-INFO 2016-02-26 02:43:24.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: mistune
-Version: 0.7.1
+Version: 0.7.2
Summary: The fastest markdown parser in pure Python
Home-page: https://github.com/lepture/mistune
Author: Hsiaoming Yang
@@ -119,7 +119,7 @@
import mistune
from pygments import highlight
from pygments.lexers import get_lexer_by_name
- from pygments.formatters import HtmlFormatter
+ from pygments.formatters import html
class HighlightRenderer(mistune.Renderer):
def block_code(self, code, lang):
@@ -127,7 +127,7 @@
return '\n<pre><code>%s</code></pre>\n' % \
mistune.escape(code)
lexer = get_lexer_by_name(lang, stripall=True)
- formatter = HtmlFormatter()
+ formatter = html.HtmlFormatter()
return highlight(code, lexer, formatter)
renderer = HighlightRenderer()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mistune-0.7.1/README.rst new/mistune-0.7.2/README.rst
--- old/mistune-0.7.1/README.rst 2015-08-11 09:55:52.000000000 +0200
+++ new/mistune-0.7.2/README.rst 2015-11-08 09:30:41.000000000 +0100
@@ -111,7 +111,7 @@
import mistune
from pygments import highlight
from pygments.lexers import get_lexer_by_name
- from pygments.formatters import HtmlFormatter
+ from pygments.formatters import html
class HighlightRenderer(mistune.Renderer):
def block_code(self, code, lang):
@@ -119,7 +119,7 @@
return '\n<pre><code>%s</code></pre>\n' % \
mistune.escape(code)
lexer = get_lexer_by_name(lang, stripall=True)
- formatter = HtmlFormatter()
+ formatter = html.HtmlFormatter()
return highlight(code, lexer, formatter)
renderer = HighlightRenderer()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mistune-0.7.1/mistune.egg-info/PKG-INFO new/mistune-0.7.2/mistune.egg-info/PKG-INFO
--- old/mistune-0.7.1/mistune.egg-info/PKG-INFO 2015-08-22 17:44:30.000000000 +0200
+++ new/mistune-0.7.2/mistune.egg-info/PKG-INFO 2016-02-26 02:43:22.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: mistune
-Version: 0.7.1
+Version: 0.7.2
Summary: The fastest markdown parser in pure Python
Home-page: https://github.com/lepture/mistune
Author: Hsiaoming Yang
@@ -119,7 +119,7 @@
import mistune
from pygments import highlight
from pygments.lexers import get_lexer_by_name
- from pygments.formatters import HtmlFormatter
+ from pygments.formatters import html
class HighlightRenderer(mistune.Renderer):
def block_code(self, code, lang):
@@ -127,7 +127,7 @@
return '\n<pre><code>%s</code></pre>\n' % \
mistune.escape(code)
lexer = get_lexer_by_name(lang, stripall=True)
- formatter = HtmlFormatter()
+ formatter = html.HtmlFormatter()
return highlight(code, lexer, formatter)
renderer = HighlightRenderer()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mistune-0.7.1/mistune.py new/mistune-0.7.2/mistune.py
--- old/mistune-0.7.1/mistune.py 2015-08-22 17:28:46.000000000 +0200
+++ new/mistune-0.7.2/mistune.py 2016-02-26 02:41:36.000000000 +0100
@@ -11,7 +11,7 @@
import re
import inspect
-__version__ = '0.7.1'
+__version__ = '0.7.2'
__author__ = 'Hsiaoming Yang <me(a)lepture.com>'
__all__ = [
'BlockGrammar', 'BlockLexer',
@@ -22,10 +22,11 @@
_key_pattern = re.compile(r'\s+')
+_nonalpha_pattern = re.compile(r'\W')
_escape_pattern = re.compile(r'&(?!#?\w+;)')
_newline_pattern = re.compile(r'\r\n|\r')
_block_quote_leading_pattern = re.compile(r'^ *> ?', flags=re.M)
-_block_code_leadning_pattern = re.compile(r'^ {4}', re.M)
+_block_code_leading_pattern = re.compile(r'^ {4}', re.M)
_inline_tags = [
'a', 'em', 'strong', 'small', 's', 'cite', 'q', 'dfn', 'abbr', 'data',
'time', 'code', 'var', 'samp', 'kbd', 'sub', 'sup', 'i', 'b', 'u', 'mark',
@@ -36,6 +37,7 @@
_valid_end = r'(?!:/|[^\w\s@]*@)\b'
_valid_attr = r'''"[^"]*"|'[^']*'|[^'">]'''
_block_tag = r'(?!(?:%s)\b)\w+%s' % ('|'.join(_inline_tags), _valid_end)
+_scheme_blacklist = ('javascript', 'data', 'vbscript')
def _pure_pattern(regex):
@@ -70,6 +72,19 @@
return text
+def escape_link(url, **kwargs):
+ """Remove dangerous URL schemes like javascript: and escape afterwards."""
+ if ':' in url:
+ scheme, _ = url.split(':', 1)
+ scheme = _nonalpha_pattern.sub('', scheme)
+ # whitelist would be better but mistune's use case is too general
+ if scheme.lower() in _scheme_blacklist:
+ return ''
+ # escape &entities; to &entities;
+ kwargs['smart_amp'] = False
+ return escape(url, **kwargs)
+
+
def preprocessing(text, tab=4):
text = _newline_pattern.sub('\n', text)
text = text.replace('\t', ' ' * tab)
@@ -224,7 +239,7 @@
def parse_block_code(self, m):
# clean leading whitespace
- code = _block_code_leadning_pattern.sub('', m.group(0))
+ code = _block_code_leading_pattern.sub('', m.group(0))
self.tokens.append({
'type': 'code',
'lang': None,
@@ -285,7 +300,7 @@
pattern = re.compile(r'^ {1,%d}' % space, flags=re.M)
item = pattern.sub('', item)
- # determin whether item is loose or not
+ # determine whether item is loose or not
loose = _next
if not loose and re.search(r'\n\n(?!\s*$)', item):
loose = True
@@ -459,9 +474,9 @@
r'^\*{2}([\s\S]+?)\*{2}(?!\*)' # **word**
)
emphasis = re.compile(
- r'^\b_((?:__|[\s\S])+?)_\b' # _word_
+ r'^\b_((?:__|[^_])+?)_\b' # _word_
r'|'
- r'^\*((?:\*\*|[\s\S])+?)\*(?!\*)' # *word*
+ r'^\*((?:\*\*|[^\*])+?)\*(?!\*)' # *word*
)
code = re.compile(r'^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)') # `code`
linebreak = re.compile(r'^ {2,}\n(?!\s*$)')
@@ -504,12 +519,14 @@
if not rules:
rules = self.grammar_class()
+ kwargs.update(self.renderer.options)
+ if kwargs.get('hard_wrap'):
+ rules.hard_wrap()
+
self.rules = rules
self._in_link = False
self._in_footnote = False
-
- kwargs.update(self.renderer.options)
self._parse_inline_html = kwargs.get('parse_inline_html')
def __call__(self, text, rules=None):
@@ -836,8 +853,7 @@
:param title: title content for `title` attribute.
:param text: text content for description.
"""
- if link.startswith('javascript:'):
- link = ''
+ link = escape_link(link, quote=True)
if not title:
return '<a href="%s">%s</a>' % (link, text)
title = escape(title, quote=True)
@@ -850,8 +866,7 @@
:param title: title text of the image.
:param text: alt text of the image.
"""
- if src.startswith('javascript:'):
- src = ''
+ src = escape_link(src, quote=True)
text = escape(text, quote=True)
if title:
title = escape(title, quote=True)
@@ -923,6 +938,8 @@
def __init__(self, renderer=None, inline=None, block=None, **kwargs):
if not renderer:
renderer = Renderer(**kwargs)
+ else:
+ kwargs.update(renderer.options)
self.renderer = renderer
@@ -934,13 +951,9 @@
if inline:
self.inline = inline
else:
- rules = InlineGrammar()
- if kwargs.get('hard_wrap'):
- rules.hard_wrap()
- self.inline = InlineLexer(renderer, rules=rules)
+ self.inline = InlineLexer(renderer, **kwargs)
self.block = block or BlockLexer(BlockGrammar())
- self.options = kwargs
self.footnotes = []
self.tokens = []
@@ -1134,7 +1147,7 @@
:param text: markdown formatted text content.
:param escape: if set to False, all html tags will not be escaped.
:param use_xhtml: output with xhtml tags.
- :param hard_wrap: if set to True, it will has GFM line breaks feature.
+ :param hard_wrap: if set to True, it will use the GFM line breaks feature.
:param parse_block_html: parse text only in block level html.
:param parse_inline_html: parse text only in inline level html.
"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mistune-0.7.1/tests/fixtures/normal/amps_and_angles_encoding.html new/mistune-0.7.2/tests/fixtures/normal/amps_and_angles_encoding.html
--- old/mistune-0.7.1/tests/fixtures/normal/amps_and_angles_encoding.html 2014-10-11 04:12:04.000000000 +0200
+++ new/mistune-0.7.2/tests/fixtures/normal/amps_and_angles_encoding.html 2016-02-26 02:37:28.000000000 +0100
@@ -8,10 +8,10 @@
<p>6 > 5.</p>
-<p>Here's a <a href="http://example.com/?foo=1&bar=2">link</a> with an ampersand in the URL.</p>
+<p>Here's a <a href="http://example.com/?foo=1&bar=2">link</a> with an ampersand in the URL.</p>
<p>Here's a link with an amersand in the link text: <a href="http://att.com/" title="AT&T">AT&T</a>.</p>
-<p>Here's an inline <a href="/script?foo=1&bar=2">link</a>.</p>
+<p>Here's an inline <a href="/script?foo=1&bar=2">link</a>.</p>
-<p>Here's an inline <a href="/script?foo=1&bar=2">link</a>.</p>
+<p>Here's an inline <a href="/script?foo=1&bar=2">link</a>.</p>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mistune-0.7.1/tests/test_cases.py new/mistune-0.7.2/tests/test_cases.py
--- old/mistune-0.7.1/tests/test_cases.py 2015-07-12 05:48:00.000000000 +0200
+++ new/mistune-0.7.2/tests/test_cases.py 2015-11-02 15:56:50.000000000 +0100
@@ -5,12 +5,7 @@
root = os.path.dirname(__file__)
known = []
-
-rules = [
- 'table', 'fenced_code', 'footnotes',
- 'autolink', 'strikethrough',
-]
-m = mistune.Markdown(rules=rules)
+m = mistune.Markdown()
def render(folder, name):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mistune-0.7.1/tests/test_extra.py new/mistune-0.7.2/tests/test_extra.py
--- old/mistune-0.7.1/tests/test_extra.py 2015-08-12 16:37:37.000000000 +0200
+++ new/mistune-0.7.2/tests/test_extra.py 2016-02-26 02:37:28.000000000 +0100
@@ -18,10 +18,27 @@
def test_safe_links():
- ret = mistune.markdown('javascript ![foo](<javascript:alert>) alert')
- assert 'src=""' in ret
- ret = mistune.markdown('javascript [foo](<javascript:alert>) alert')
- assert 'href=""' in ret
+ attack_vectors = (
+ # "standard" javascript pseudo protocol
+ ('javascript:alert`1`', ''),
+ # bypass attempt
+ ('jAvAsCrIpT:alert`1`', ''),
+ # javascript pseudo protocol with entities
+ ('javascript:alert`1`', 'javascript&colon;alert`1`'),
+ # javascript pseudo protocol with prefix (dangerous in Chrome)
+ ('\x1Ajavascript:alert`1`', ''),
+ # data-URI (dangerous in Firefox)
+ ('data:text/html,<script>alert`1`</script>', ''),
+ # vbscript-URI (dangerous in Internet Explorer)
+ ('vbscript:msgbox', ''),
+ # breaking out of the attribute
+ ('"<>', '"<>'),
+ )
+ for vector, expected in attack_vectors:
+ # image
+ assert 'src="%s"' % expected in mistune.markdown('![atk](%s)' % vector)
+ # link
+ assert 'href="%s"' % expected in mistune.markdown('[atk](%s)' % vector)
def test_skip_style():
@@ -89,3 +106,10 @@
def test_not_escape_inline_tags():
text = '<a name="top"></a>'
assert text in mistune.markdown(text, escape=False)
+
+
+def test_hard_wrap_renderer():
+ text = 'foo\nnewline'
+ renderer = mistune.Renderer(hard_wrap=True)
+ func = mistune.Markdown(renderer=renderer)
+ assert '<br>' in func(text)
1
0
Hello community,
here is the log from the commit of package poedit for openSUSE:Factory checked in at 2016-02-29 09:14:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/poedit (Old)
and /work/SRC/openSUSE:Factory/.poedit.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "poedit"
Changes:
--------
--- /work/SRC/openSUSE:Factory/poedit/poedit.changes 2016-02-11 12:37:46.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.poedit.new/poedit.changes 2016-02-29 09:15:59.000000000 +0100
@@ -1,0 +2,6 @@
+Sat Feb 27 17:32:41 UTC 2016 - astieger(a)suse.com
+
+- poedit 1.8.7.1:
+ * Add explicit boost dependencies in cpprest
+
+-------------------------------------------------------------------
Old:
----
poedit-1.8.7.tar.gz
New:
----
poedit-1.8.7.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ poedit.spec ++++++
--- /var/tmp/diff_new_pack.0MeE2c/_old 2016-02-29 09:16:00.000000000 +0100
+++ /var/tmp/diff_new_pack.0MeE2c/_new 2016-02-29 09:16:00.000000000 +0100
@@ -20,7 +20,7 @@
%bcond_without language_detection
%bcond_without crowdin_integration
Name: poedit
-Version: 1.8.7
+Version: 1.8.7.1
Release: 0
Summary: Cross-platform Gettext Catalogs Editing Tool
License: MIT
++++++ poedit-1.8.7.tar.gz -> poedit-1.8.7.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/poedit-1.8.7/configure new/poedit-1.8.7.1/configure
--- old/poedit-1.8.7/configure 2016-02-02 19:39:47.000000000 +0100
+++ new/poedit-1.8.7.1/configure 2016-02-23 12:59:22.000000000 +0100
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for poedit 1.8.7.
+# Generated by GNU Autoconf 2.68 for poedit 1.8.7.1.
#
# Report bugs to <help(a)poedit.net>.
#
@@ -560,8 +560,8 @@
# Identity of this package.
PACKAGE_NAME='poedit'
PACKAGE_TARNAME='poedit'
-PACKAGE_VERSION='1.8.7'
-PACKAGE_STRING='poedit 1.8.7'
+PACKAGE_VERSION='1.8.7.1'
+PACKAGE_STRING='poedit 1.8.7.1'
PACKAGE_BUGREPORT='help(a)poedit.net'
PACKAGE_URL=''
@@ -1331,7 +1331,7 @@
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures poedit 1.8.7 to adapt to many kinds of systems.
+\`configure' configures poedit 1.8.7.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1401,7 +1401,7 @@
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of poedit 1.8.7:";;
+ short | recursive ) echo "Configuration of poedit 1.8.7.1:";;
esac
cat <<\_ACEOF
@@ -1529,7 +1529,7 @@
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-poedit configure 1.8.7
+poedit configure 1.8.7.1
generated by GNU Autoconf 2.68
Copyright (C) 2010 Free Software Foundation, Inc.
@@ -1936,7 +1936,7 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by poedit $as_me 1.8.7, which was
+It was created by poedit $as_me 1.8.7.1, which was
generated by GNU Autoconf 2.68. Invocation command line was
$ $0 $@
@@ -2284,7 +2284,7 @@
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-PACKAGE_SHORT_VERSION=1.8.7
+PACKAGE_SHORT_VERSION=1.8.7.1
ac_aux_dir=
@@ -2828,7 +2828,7 @@
# Define the identity of the package.
PACKAGE='poedit'
- VERSION='1.8.7'
+ VERSION='1.8.7.1'
cat >>confdefs.h <<_ACEOF
@@ -5201,7 +5201,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libcpprest >= 2.5" >&5
$as_echo_n "checking for libcpprest >= 2.5... " >&6; }
old_LIBS="$LIBS"
- LIBS="-lcpprest $LIBS"
+ LIBS="-lcpprest -lboost_system -lssl -lcrypto $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -5364,7 +5364,7 @@
$as_echo "#define HAVE_HTTP_CLIENT 1" >>confdefs.h
- CPPREST_LIBS="-lcpprest"
+ CPPREST_LIBS="-lcpprest -lboost_system -lssl -lcrypto"
pkg_failed=no
@@ -7270,7 +7270,7 @@
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by poedit $as_me 1.8.7, which was
+This file was extended by poedit $as_me 1.8.7.1, which was
generated by GNU Autoconf 2.68. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -7327,7 +7327,7 @@
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-poedit config.status 1.8.7
+poedit config.status 1.8.7.1
configured by $0, generated by GNU Autoconf 2.68,
with options \\"\$ac_cs_config\\"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/poedit-1.8.7/configure.ac new/poedit-1.8.7.1/configure.ac
--- old/poedit-1.8.7/configure.ac 2016-02-02 19:38:20.000000000 +0100
+++ new/poedit-1.8.7.1/configure.ac 2016-02-23 12:57:43.000000000 +0100
@@ -2,8 +2,8 @@
AC_PREREQ(2.59)
-AC_INIT([poedit], [1.8.7], [help(a)poedit.net]
-PACKAGE_SHORT_VERSION=1.8.7
+AC_INIT([poedit], [1.8.7.1], [help(a)poedit.net]
+PACKAGE_SHORT_VERSION=1.8.7.1
AC_SUBST(PACKAGE_SHORT_VERSION)
AC_CONFIG_AUX_DIR([admin])
@@ -73,7 +73,7 @@
[
AC_MSG_CHECKING([for libcpprest >= 2.5])
old_LIBS="$LIBS"
- LIBS="-lcpprest $LIBS"
+ LIBS="-lcpprest -lboost_system -lssl -lcrypto $LIBS"
AC_LINK_IFELSE([AC_LANG_PROGRAM(
[
#include <cpprest/version.h>
@@ -96,7 +96,7 @@
AS_IF([test "x$have_cpprest" = "xyes"],
[
AC_DEFINE([HAVE_HTTP_CLIENT])
- CPPREST_LIBS="-lcpprest"
+ CPPREST_LIBS="-lcpprest -lboost_system -lssl -lcrypto"
AC_SUBST(CPPREST_LIBS)
PKG_CHECK_MODULES([LIBSECRET], [libsecret-1], [
CXXFLAGS="$CXXFLAGS $LIBSECRET_CFLAGS"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/poedit-1.8.7/docs/poedit.1 new/poedit-1.8.7.1/docs/poedit.1
--- old/poedit-1.8.7/docs/poedit.1 2016-02-02 19:39:48.000000000 +0100
+++ new/poedit-1.8.7.1/docs/poedit.1 2016-02-23 12:59:22.000000000 +0100
@@ -2,12 +2,12 @@
.\" Title: poedit
.\" Author: Vaclav Slavik <vaclav(a)slavik.io>
.\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/>
-.\" Date: 02/02/2016
+.\" Date: 02/23/2016
.\" Manual: \ \&
.\" Source: \ \&
.\" Language: English
.\"
-.TH "POEDIT" "1" "02/02/2016" "\ \&" "\ \&"
+.TH "POEDIT" "1" "02/23/2016" "\ \&" "\ \&"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/poedit-1.8.7/src/utility.cpp new/poedit-1.8.7.1/src/utility.cpp
--- old/poedit-1.8.7/src/utility.cpp 2016-02-02 19:38:25.000000000 +0100
+++ new/poedit-1.8.7.1/src/utility.cpp 2016-02-23 12:57:48.000000000 +0100
@@ -263,8 +263,11 @@
return false;
#ifdef __UNIX__
- chown(destPath, st.st_uid, st.st_gid);
- chmod(destPath, st.st_mode);
+ if (overwrite)
+ {
+ chown(destPath, st.st_uid, st.st_gid);
+ chmod(destPath, st.st_mode);
+ }
#endif
return true;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/poedit-1.8.7/src/version.h new/poedit-1.8.7.1/src/version.h
--- old/poedit-1.8.7/src/version.h 2016-02-02 19:38:25.000000000 +0100
+++ new/poedit-1.8.7.1/src/version.h 2016-02-23 12:57:48.000000000 +0100
@@ -26,7 +26,7 @@
#ifndef _VERSION_H_
#define _VERSION_H_
-#define POEDIT_VERSION "1.8.7"
+#define POEDIT_VERSION "1.8.7.1"
#define POEDIT_VERSION_WIN 1,8,7
#endif // _VERSION_H_
1
0
Hello community,
here is the log from the commit of package python-yubico for openSUSE:Factory checked in at 2016-02-29 09:14:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-yubico (Old)
and /work/SRC/openSUSE:Factory/.python-yubico.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-yubico"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-yubico/python-yubico.changes 2015-11-10 10:03:01.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.python-yubico.new/python-yubico.changes 2016-02-29 09:15:54.000000000 +0100
@@ -1,0 +2,10 @@
+Tue Feb 23 11:48:24 UTC 2016 - michael(a)stroeder.com
+
+- update to 1.3.2
+ * yubico/yubikey_usb_hid.py: change logic for pgm seq if no
+ config is valid, seq 0 is ok
+ * yubico/yubikey_usb_hid.py: that the new sequence is 0 is also ok
+ * yubico/yubikey_frame.py: Added comments explaining debug data.
+ * Solved: Unlock code couldn't be set
+
+-------------------------------------------------------------------
Old:
----
python-yubico-1.3.1.tar.gz
python-yubico-1.3.1.tar.gz.sig
New:
----
python-yubico-1.3.2.tar.gz
python-yubico-1.3.2.tar.gz.sig
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-yubico.spec ++++++
--- /var/tmp/diff_new_pack.VU8yKY/_old 2016-02-29 09:15:55.000000000 +0100
+++ /var/tmp/diff_new_pack.VU8yKY/_new 2016-02-29 09:15:55.000000000 +0100
@@ -22,7 +22,7 @@
BuildArch: noarch
%endif
Name: python-yubico
-Version: 1.3.1
+Version: 1.3.2
Release: 0
Summary: Python code for talking to Yubico's YubiKeys
License: BSD-2-Clause
++++++ python-yubico-1.3.1.tar.gz -> python-yubico-1.3.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-yubico-1.3.1/ChangeLog new/python-yubico-1.3.2/ChangeLog
--- old/python-yubico-1.3.1/ChangeLog 2015-10-01 15:59:08.000000000 +0200
+++ new/python-yubico-1.3.2/ChangeLog 2016-02-23 12:24:39.000000000 +0100
@@ -1,3 +1,32 @@
+2016-02-23 Dain Nilsson <dain(a)yubico.com>
+
+ * NEWS, release.py, yubico/yubico_version.py: Bumped version and
+ updated NEWS for release.
+
+2015-11-03 Klas Lindfors <klas(a)yubico.com>
+
+ * yubico/yubikey_usb_hid.py: change logic for pgm seq if no config is valid, seq 0 is ok
+
+2015-11-03 Klas Lindfors <klas(a)yubico.com>
+
+ * yubico/yubikey_usb_hid.py: that the new sequence is 0 is also ok
+
+2015-10-07 Dain Nilsson <dain(a)yubico.com>
+
+ * yubico/yubikey_frame.py: Added comments explaining debug data.
+
+2015-10-07 Dain Nilsson <dainzor(a)gmail.com>
+
+ * : Merge pull request #31 from axhoffmann/master Solved: Unlock code couldn't be set
+
+2015-10-01 Dain Nilsson <dain(a)yubico.com>
+
+ * MANIFEST.in: Include tests.
+
+2015-10-01 Dain Nilsson <dain(a)yubico.com>
+
+ * NEWS, yubico/yubico_version.py: Bumped version post release.
+
2015-10-01 Dain Nilsson <dain(a)yubico.com>
* NEWS, yubico/yubico_version.py: Update version and NEWS for
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-yubico-1.3.1/MANIFEST.in new/python-yubico-1.3.2/MANIFEST.in
--- old/python-yubico-1.3.1/MANIFEST.in 2015-10-01 15:51:28.000000000 +0200
+++ new/python-yubico-1.3.2/MANIFEST.in 2016-02-23 12:21:35.000000000 +0100
@@ -5,3 +5,4 @@
include examples/*
include util/*
include doc/*
+recursive-include test *.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-yubico-1.3.1/NEWS new/python-yubico-1.3.2/NEWS
--- old/python-yubico-1.3.1/NEWS 2015-10-01 15:58:46.000000000 +0200
+++ new/python-yubico-1.3.2/NEWS 2016-02-23 12:21:35.000000000 +0100
@@ -1,3 +1,7 @@
+* Version 1.3.2 (released 2016-02-23)
+ ** Various fixes to sequence number checking.
+ ** Fix issue with using an access code with the debug flag on.
+
* Version 1.3.1 (released 2015-10-01)
** Fixup release to correct packages listed in last release.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-yubico-1.3.1/PKG-INFO new/python-yubico-1.3.2/PKG-INFO
--- old/python-yubico-1.3.1/PKG-INFO 2015-10-01 15:59:08.000000000 +0200
+++ new/python-yubico-1.3.2/PKG-INFO 2016-02-23 12:24:40.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: python-yubico
-Version: 1.3.1
+Version: 1.3.2
Summary: Python code for talking to Yubico's YubiKeys
Home-page: https://github.com/Yubico/python-yubico
Author: Yubico Open Source Maintainers
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-yubico-1.3.1/python_yubico.egg-info/PKG-INFO new/python-yubico-1.3.2/python_yubico.egg-info/PKG-INFO
--- old/python-yubico-1.3.1/python_yubico.egg-info/PKG-INFO 2015-10-01 15:59:08.000000000 +0200
+++ new/python-yubico-1.3.2/python_yubico.egg-info/PKG-INFO 2016-02-23 12:24:39.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: python-yubico
-Version: 1.3.1
+Version: 1.3.2
Summary: Python code for talking to Yubico's YubiKeys
Home-page: https://github.com/Yubico/python-yubico
Author: Yubico Open Source Maintainers
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-yubico-1.3.1/python_yubico.egg-info/SOURCES.txt new/python-yubico-1.3.2/python_yubico.egg-info/SOURCES.txt
--- old/python-yubico-1.3.1/python_yubico.egg-info/SOURCES.txt 2015-10-01 15:59:08.000000000 +0200
+++ new/python-yubico-1.3.2/python_yubico.egg-info/SOURCES.txt 2016-02-23 12:24:39.000000000 +0100
@@ -19,7 +19,12 @@
python_yubico.egg-info/requires.txt
python_yubico.egg-info/top_level.txt
test/__init__.py
-test/__init__.pyc
+test/soft/__init__.py
+test/soft/test_yubico.py
+test/soft/test_yubikey_config.py
+test/soft/test_yubikey_frame.py
+test/usb/__init__.py
+test/usb/test_yubikey_usb_hid.py
util/yubikey-totp
util/yubikey-totp.1
yubico/__init__.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-yubico-1.3.1/release.py new/python-yubico-1.3.2/release.py
--- old/python-yubico-1.3.1/release.py 2015-10-01 15:51:09.000000000 +0200
+++ new/python-yubico-1.3.2/release.py 2016-02-23 12:21:35.000000000 +0100
@@ -123,9 +123,8 @@
if not self.skip_tests:
self.run_command('check')
- # Nosetests calls sys.exit(status)
try:
- self.run_command('nosetests')
+ self.run_command('test')
except SystemExit as e:
if e.code != 0:
raise DistutilsSetupError("There were test failures!")
Files old/python-yubico-1.3.1/test/__init__.pyc and new/python-yubico-1.3.2/test/__init__.pyc differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-yubico-1.3.1/test/soft/__init__.py new/python-yubico-1.3.2/test/soft/__init__.py
--- old/python-yubico-1.3.1/test/soft/__init__.py 1970-01-01 01:00:00.000000000 +0100
+++ new/python-yubico-1.3.2/test/soft/__init__.py 2016-02-23 12:21:35.000000000 +0100
@@ -0,0 +1,7 @@
+# Copyright (c) 2010, 2011, 2012 Yubico AB
+# See the file COPYING for licence statement.
+
+"""
+Unit tests testing logic of the library.
+These do not require a physical YubiKey to run.
+"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-yubico-1.3.1/test/soft/test_yubico.py new/python-yubico-1.3.2/test/soft/test_yubico.py
--- old/python-yubico-1.3.1/test/soft/test_yubico.py 1970-01-01 01:00:00.000000000 +0100
+++ new/python-yubico-1.3.2/test/soft/test_yubico.py 2016-02-23 12:21:35.000000000 +0100
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+#
+# Simple test cases for a Python version of the yubikey_crc16() function in ykcrc.c.
+#
+
+import struct
+import unittest
+import yubico.yubico_util as yubico_util
+from yubico.yubico_util import crc16
+
+CRC_OK_RESIDUAL=0xf0b8
+
+class TestCRC(unittest.TestCase):
+
+ def test_first(self):
+ """ Test CRC16 trivial case """
+ buffer = b'\x01\x02\x03\x04'
+ crc = crc16(buffer)
+ self.assertEqual(crc, 0xc66e)
+ return buffer,crc
+
+ def test_second(self):
+ """ Test CRC16 residual calculation """
+ buffer,crc = self.test_first()
+ # Append 1st complement for a "self-verifying" block -
+ # from example in Yubikey low level interface
+ crc_inv = 0xffff - crc
+ buffer += struct.pack('<H', crc_inv)
+ crc2 = crc16(buffer)
+ self.assertEqual(crc2, CRC_OK_RESIDUAL)
+
+ def test_hexdump(self):
+ """ Test hexdump function, normal use """
+ bytes = b'\x01\x02\x03\x04\x05\x06\x07\x08'
+ self.assertEqual(yubico_util.hexdump(bytes, length=4), \
+ '0000 01 02 03 04\n0004 05 06 07 08\n')
+
+ def test_hexdump2(self):
+ """ Test hexdump function, with colors """
+ bytes = b'\x01\x02\x03\x04\x05\x06\x07\x08'
+ self.assertEqual(yubico_util.hexdump(bytes, length=4, colorize=True), \
+ '0000 \x1b[0m01 02 03\x1b[0m 04\n0004 \x1b[0m05 06 07\x1b[0m 08\n')
+
+ def test_modhex_decode(self):
+ """ Test modhex decoding """
+ self.assertEqual(b"0123456789abcdef", yubico_util.modhex_decode(b"cbdefghijklnrtuv"))
+
+if __name__ == '__main__':
+ unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-yubico-1.3.1/test/soft/test_yubikey_config.py new/python-yubico-1.3.2/test/soft/test_yubikey_config.py
--- old/python-yubico-1.3.1/test/soft/test_yubikey_config.py 1970-01-01 01:00:00.000000000 +0100
+++ new/python-yubico-1.3.2/test/soft/test_yubikey_config.py 2016-02-23 12:21:35.000000000 +0100
@@ -0,0 +1,307 @@
+#!/usr/bin/env python
+
+import unittest
+import yubico
+import yubico.yubikey_config
+from yubico.yubikey_usb_hid import YubiKeyConfigUSBHID
+import yubico.yubico_util
+import yubico.yubico_exception
+
+class YubiKeyTests(unittest.TestCase):
+
+ def setUp(self):
+ version = (2, 2, 0,)
+ capa = yubico.yubikey_usb_hid.YubiKeyUSBHIDCapabilities( \
+ model = 'YubiKey', version = version, default_answer = False)
+ self.Config = YubiKeyConfigUSBHID(ykver = version, capabilities = capa)
+
+ def test_static_ticket(self):
+ """ Test static ticket """
+
+ #fixed: m:
+ #uid: h:000000000000
+ #key: h:e2bee9a36568a00d026a02f85e61e6fb
+ #acc_code: h:000000000000
+ #ticket_flags: APPEND_CR
+ #config_flags: STATIC_TICKET
+
+ expected = [b'\x00\x00\x00\x00\x00\x00\x00\x80',
+ b'\x00\xe2\xbe\xe9\xa3\x65\x68\x83',
+ b'\xa0\x0d\x02\x6a\x02\xf8\x5e\x84',
+ b'\x61\xe6\xfb\x00\x00\x00\x00\x85',
+ b'\x00\x00\x00\x00\x20\x20\x00\x86',
+ b'\x00\x5a\x93\x00\x00\x00\x00\x87',
+ b'\x00\x01\x95\x56\x00\x00\x00\x89'
+ ]
+
+ Config = self.Config
+ Config.aes_key(b'h:e2bee9a36568a00d026a02f85e61e6fb')
+ Config.ticket_flag('APPEND_CR', True)
+ Config.config_flag('STATIC_TICKET', True)
+
+ data = Config.to_frame(slot=1).to_feature_reports()
+
+ print("EXPECT:\n%s\nGOT:\n%s\n" %( yubico.yubico_util.hexdump(b''.join(expected)),
+ yubico.yubico_util.hexdump(b''.join(data))))
+
+ self.assertEqual(data, expected)
+
+
+ def test_static_ticket_with_access_code(self):
+ """ Test static ticket with unlock code """
+
+ #fixed: m:
+ #uid: h:000000000000
+ #key: h:e2bee9a36568a00d026a02f85e61e6fb
+ #acc_code: h:010203040506
+ #ticket_flags: APPEND_CR
+ #config_flags: STATIC_TICKET
+
+ expected = [b'\x00\x00\x00\x00\x00\x00\x00\x80',
+ b'\x00\xe2\xbe\xe9\xa3\x65\x68\x83',
+ b'\xa0\x0d\x02\x6a\x02\xf8\x5e\x84',
+ b'\x61\xe6\xfb\x01\x02\x03\x04\x85',
+ b'\x05\x06\x00\x00\x20\x20\x00\x86',
+ b'\x00\x0d\x39\x01\x02\x03\x04\x87',
+ b'\x05\x06\x00\x00\x00\x00\x00\x88',
+ b'\x00\x01\xc2\xfc\x00\x00\x00\x89',
+ ]
+
+ Config = self.Config
+ Config.aes_key(b'h:e2bee9a36568a00d026a02f85e61e6fb')
+ Config.ticket_flag('APPEND_CR', True)
+ Config.config_flag('STATIC_TICKET', True)
+ Config.unlock_key(b'h:010203040506')
+
+ data = Config.to_frame(slot=1).to_feature_reports()
+
+ print("EXPECT:\n%s\nGOT:\n%s\n" %( yubico.yubico_util.hexdump(b''.join(expected)),
+ yubico.yubico_util.hexdump(b''.join(data))))
+
+ self.assertEqual(data, expected)
+
+ def test_fixed_and_oath_hotp(self):
+ """ Test OATH HOTP with a fixed prefix-string """
+
+ #fixed: m:ftftftft
+ #uid: h:000000000000
+ #key: h:523d7ce7e7b6ee853517a3e3cc1985c7
+ #acc_code: h:000000000000
+ #ticket_flags: APPEND_CR|OATH_HOTP
+ #config_flags: OATH_FIXED_MODHEX1|OATH_FIXED_MODHEX2|STATIC_TICKET
+
+ expected = [b'\x4d\x4d\x4d\x4d\x00\x00\x00\x80',
+ b'\x00\x52\x3d\x7c\xe7\xe7\xb6\x83',
+ b'\xee\x85\x35\x17\xa3\xe3\xcc\x84',
+ b'\x19\x85\xc7\x00\x00\x00\x00\x85',
+ b'\x00\x00\x04\x00\x60\x70\x00\x86',
+ b'\x00\x72\xad\xaa\xbb\xcc\xdd\x87',
+ b'\xee\xff\x00\x00\x00\x00\x00\x88',
+ b'\x00\x03\xfe\xc4\x00\x00\x00\x89',
+ ]
+
+ Config = self.Config
+ Config.aes_key(b'h:523d7ce7e7b6ee853517a3e3cc1985c7')
+ Config.fixed_string(b'm:ftftftft')
+ Config.ticket_flag('APPEND_CR', True)
+ Config.ticket_flag('OATH_HOTP', True)
+ Config.config_flag('OATH_FIXED_MODHEX1', True)
+ Config.config_flag('OATH_FIXED_MODHEX2', True)
+ Config.config_flag('STATIC_TICKET', True)
+ Config.unlock_key(b'h:aabbccddeeff')
+ Config.access_key(b'h:000000000000')
+
+ data = Config.to_frame(slot=2).to_feature_reports()
+
+ print("EXPECT:\n%s\nGOT:\n%s\n" %( yubico.yubico_util.hexdump(b''.join(expected)),
+ yubico.yubico_util.hexdump(b''.join(data))))
+
+ self.assertEqual(data, expected)
+
+ def test_challenge_response_hmac_nist(self):
+ """ Test HMAC challenge response with NIST test vector """
+
+ expected = [b'\x00\x00\x00\x00\x00\x00\x00\x80',
+ b'\x00\x00\x40\x41\x42\x43\x00\x82',
+ b'\x00\x30\x31\x32\x33\x34\x35\x83',
+ b'\x36\x37\x38\x39\x3a\x3b\x3c\x84',
+ b'\x3d\x3e\x3f\x00\x00\x00\x00\x85',
+ b'\x00\x00\x00\x04\x40\x26\x00\x86',
+ b'\x00\x98\x41\x00\x00\x00\x00\x87',
+ b'\x00\x03\x95\x56\x00\x00\x00\x89',
+ ]
+
+ Config = self.Config
+ secret = b'h:303132333435363738393a3b3c3d3e3f40414243'
+ Config.mode_challenge_response(secret, type='HMAC', variable=True)
+ Config.extended_flag('SERIAL_API_VISIBLE', True)
+
+ data = Config.to_frame(slot=2).to_feature_reports()
+
+ print("EXPECT:\n%s\nGOT:\n%s\n" %( yubico.yubico_util.hexdump(b''.join(expected)),
+ yubico.yubico_util.hexdump(b''.join(data))))
+
+ self.assertEqual(data, expected)
+
+ def test_unknown_ticket_flag(self):
+ """ Test setting unknown ticket flag """
+ Config = self.Config
+ self.assertRaises(yubico.yubico_exception.InputError, Config.ticket_flag, 'YK_UNIT_TEST123', True)
+
+ def test_unknown_ticket_flag_integer(self):
+ """ Test setting unknown ticket flag as integer """
+ future_flag = 0xff
+ Config = self.Config
+ Config.ticket_flag(future_flag, True)
+ self.assertEqual(future_flag, Config.ticket_flags.to_integer())
+
+ def test_too_long_fixed_string(self):
+ """ Test too long fixed string, and set as plain string """
+ Config = self.Config
+ self.assertRaises(yubico.yubico_exception.InputError, Config.ticket_flag, 'YK_UNIT_TEST123', True)
+
+ def test_default_flags(self):
+ """ Test that no flags get set by default """
+ Config = self.Config
+ self.assertEqual(0x0, Config.ticket_flags.to_integer())
+ self.assertEqual(0x0, Config.config_flags.to_integer())
+ self.assertEqual(0x0, Config.extended_flags.to_integer())
+
+ def test_oath_hotp_like_windows(self):
+ """ Test plain OATH-HOTP with NIST test vector """
+
+ expected = [b'\x00\x00\x00\x00\x00\x00\x00\x80',
+ b'\x00\x00\x40\x41\x42\x43\x00\x82',
+ b'\x00\x30\x31\x32\x33\x34\x35\x83',
+ b'\x36\x37\x38\x39\x3a\x3b\x3c\x84',
+ b'\x3d\x3e\x3f\x00\x00\x00\x00\x85',
+ b'\x00\x00\x00\x00\x40\x00\x00\x86',
+ b'\x00\x6a\xb9\x00\x00\x00\x00\x87',
+ b'\x00\x03\x95\x56\x00\x00\x00\x89',
+ ]
+
+ Config = self.Config
+ secret = b'h:303132333435363738393a3b3c3d3e3f40414243'
+ Config.mode_oath_hotp(secret)
+
+ data = Config.to_frame(slot=2).to_feature_reports()
+
+ print("EXPECT:\n%s\nGOT:\n%s\n" %( yubico.yubico_util.hexdump(b''.join(expected)),
+ yubico.yubico_util.hexdump(b''.join(data))))
+
+ self.assertEqual(data, expected)
+
+ def test_oath_hotp_like_windows2(self):
+ """ Test OATH-HOTP with NIST test vector and token identifier """
+
+ expected = [b'\x01\x02\x03\x04\x05\x06\x00\x80',
+ b'\x00\x00\x40\x41\x42\x43\x00\x82',
+ b'\x00\x30\x31\x32\x33\x34\x35\x83',
+ b'\x36\x37\x38\x39\x3a\x3b\x3c\x84',
+ b'\x3d\x3e\x3f\x00\x00\x00\x00\x85',
+ b'\x00\x00\x06\x00\x40\x42\x00\x86',
+ b'\x00\x0e\xec\x00\x00\x00\x00\x87',
+ b'\x00\x03\x95\x56\x00\x00\x00\x89',
+ ]
+
+ Config = self.Config
+ secret = b'h:303132333435363738393a3b3c3d3e3f40414243'
+ Config.mode_oath_hotp(secret, digits=8, factor_seed='', omp=0x01, tt=0x02, mui=b'\x03\x04\x05\x06')
+ Config.config_flag('OATH_FIXED_MODHEX2', True)
+
+ data = Config.to_frame(slot=2).to_feature_reports()
+
+ print("EXPECT:\n%s\nGOT:\n%s\n" %( yubico.yubico_util.hexdump(b''.join(expected)),
+ yubico.yubico_util.hexdump(b''.join(data))))
+
+ self.assertEqual(data, expected)
+
+ def test_oath_hotp_like_windows_factory_seed(self):
+ """ Test OATH-HOTP factor_seed """
+
+ expected = [b'\x01\x02\x03\x04\x05\x06\x00\x80',
+ b'\x00\x00\x40\x41\x42\x43\x01\x82',
+ b'\x21\x30\x31\x32\x33\x34\x35\x83',
+ b'\x36\x37\x38\x39\x3a\x3b\x3c\x84',
+ b'\x3d\x3e\x3f\x00\x00\x00\x00\x85',
+ b'\x00\x00\x06\x00\x40\x42\x00\x86',
+ b'\x00\x03\xea\x00\x00\x00\x00\x87',
+ b'\x00\x03\x95\x56\x00\x00\x00\x89',
+ ]
+
+ Config = self.Config
+ secret = b'h:303132333435363738393a3b3c3d3e3f40414243'
+ Config.mode_oath_hotp(secret, digits=8, factor_seed=0x2101, omp=0x01, tt=0x02, mui=b'\x03\x04\x05\x06')
+ Config.config_flag('OATH_FIXED_MODHEX2', True)
+
+ data = Config.to_frame(slot=2).to_feature_reports()
+
+ print("EXPECT:\n%s\nGOT:\n%s\n" %( yubico.yubico_util.hexdump(b''.join(expected)),
+ yubico.yubico_util.hexdump(b''.join(data))))
+
+ self.assertEqual(data, expected)
+
+ def test_fixed_length_hmac_like_windows(self):
+ """ Test fixed length HMAC SHA1 """
+
+ expected = [b'\x00\x00\x00\x00\x00\x00\x00\x80',
+ b'\x00\x00\x40\x41\x42\x43\x00\x82',
+ b'\x00\x30\x31\x32\x33\x34\x35\x83',
+ b'\x36\x37\x38\x39\x3a\x3b\x3c\x84',
+ b'\x3d\x3e\x3f\x00\x00\x00\x00\x85',
+ b'\x00\x00\x00\x00\x40\x22\x00\x86',
+ b'\x00\xe9\x0f\x00\x00\x00\x00\x87',
+ b'\x00\x03\x95\x56\x00\x00\x00\x89',
+ ]
+
+ Config = self.Config
+ secret = b'h:303132333435363738393a3b3c3d3e3f40414243'
+ Config.mode_challenge_response(secret, type='HMAC', variable=False)
+
+ data = Config.to_frame(slot=2).to_feature_reports()
+
+ print("EXPECT:\n%s\nGOT:\n%s\n" %( yubico.yubico_util.hexdump(b''.join(expected)),
+ yubico.yubico_util.hexdump(b''.join(data))))
+
+ self.assertEqual(data, expected)
+
+ def test_version_required_1(self):
+ """ Test YubiKey 1 with v2 option """
+ version = (1, 3, 0,)
+ capa = yubico.yubikey_usb_hid.YubiKeyUSBHIDCapabilities( \
+ model = 'YubiKey', version = version, default_answer = False)
+ Config = YubiKeyConfigUSBHID(ykver = version, capabilities = capa)
+ self.assertRaises(yubico.yubikey.YubiKeyVersionError, Config.config_flag, 'SHORT_TICKET', True)
+
+ def test_version_required_2(self):
+ """ Test YubiKey 2 with v2 option """
+
+ Config = self.Config
+ Config.config_flag('SHORT_TICKET', True)
+ self.assertEqual((2, 0), Config.version_required())
+
+ def test_version_required_3(self):
+ """ Test YubiKey 2 with v1 option """
+
+ Config = self.Config
+ self.assertRaises(yubico.yubikey.YubiKeyVersionError, Config.config_flag, 'TICKET_FIRST', True)
+
+ def test_version_required_4(self):
+ """ Test YubiKey 2.1 with v2.2 mode """
+ version = (2, 1, 0,)
+ capa = yubico.yubikey_usb_hid.YubiKeyUSBHIDCapabilities( \
+ model = 'YubiKey', version = version, default_answer = False)
+ Config = YubiKeyConfigUSBHID(ykver = version, capabilities = capa)
+ secret = b'h:303132333435363738393a3b3c3d3e3f40414243'
+ self.assertRaises(yubico.yubikey.YubiKeyVersionError, Config.mode_challenge_response, secret)
+
+ def test_version_required_5(self):
+ """ Test YubiKey 2.2 with v2.2 mode """
+
+ Config = self.Config
+ secret = b'h:303132333435363738393a3b3c3d3e3f'
+ Config.mode_challenge_response(secret, type='OTP')
+ self.assertEqual('CHAL_RESP', Config._mode)
+
+if __name__ == '__main__':
+ unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-yubico-1.3.1/test/soft/test_yubikey_frame.py new/python-yubico-1.3.2/test/soft/test_yubikey_frame.py
--- old/python-yubico-1.3.1/test/soft/test_yubikey_frame.py 1970-01-01 01:00:00.000000000 +0100
+++ new/python-yubico-1.3.2/test/soft/test_yubikey_frame.py 2016-02-23 12:21:35.000000000 +0100
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+
+from yubico import *
+from yubico.yubikey_frame import *
+import yubico.yubico_exception
+import unittest
+import struct
+import re
+
+class YubiKeyTests(unittest.TestCase):
+
+ def test_get_ykframe(self):
+ """ Test normal use """
+ buffer = YubiKeyFrame(command=0x01).to_string()
+
+ # check number of bytes returned
+ self.assertEqual(len(buffer), 70, "yubikey command buffer should always be 70 bytes")
+
+ # check that empty payload works (64 * '\x00')
+ all_zeros = b'\x00' * 64
+
+ self.assertTrue(buffer.startswith(all_zeros))
+
+
+ def test_get_ykframe_feature_reports(self):
+ """ Test normal use """
+ res = YubiKeyFrame(command=0x32).to_feature_reports()
+
+ self.assertEqual(res, [b'\x00\x00\x00\x00\x00\x00\x00\x80',
+ b'\x00\x32\x6b\x5b\x00\x00\x00\x89'
+ ])
+
+
+ def test_get_ykframe_feature_reports2(self):
+ """ Test one serie of non-zero bytes in the middle of the payload """
+ payload = b'\x00' * 38
+ payload += b'\x01\x02\x03'
+ payload += b'\x00' * 23
+ res = YubiKeyFrame(command=0x32, payload=payload).to_feature_reports()
+
+ self.assertEqual(res, [b'\x00\x00\x00\x00\x00\x00\x00\x80',
+ b'\x00\x00\x00\x01\x02\x03\x00\x85',
+ b'\x002\x01s\x00\x00\x00\x89'])
+
+ def test_bad_payload(self):
+ """ Test that we get an exception for four bytes payload """
+ self.assertRaises(yubico_exception.InputError, YubiKeyFrame, command=0x32, payload=b'test')
+
+ def test_repr(self):
+ """ Test string representation of object """
+ # to achieve 100% test coverage ;)
+ frame = YubiKeyFrame(command=0x4d)
+ print("Frame is represented as %s" % frame)
+ re_match = re.search("YubiKeyFrame instance at .*: 77.$", str(frame))
+ self.assertNotEqual(re_match, None)
+
+if __name__ == '__main__':
+ unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-yubico-1.3.1/test/usb/__init__.py new/python-yubico-1.3.2/test/usb/__init__.py
--- old/python-yubico-1.3.1/test/usb/__init__.py 1970-01-01 01:00:00.000000000 +0100
+++ new/python-yubico-1.3.2/test/usb/__init__.py 2016-02-23 12:21:35.000000000 +0100
@@ -0,0 +1,7 @@
+# Copyright (c) 2010, 2011, 2012 Yubico AB
+# See the file COPYING for licence statement.
+
+"""
+Tests that run against a physical YubiKey.
+These tests require an attached YubiKey that has been correctly configured.
+"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-yubico-1.3.1/test/usb/test_yubikey_usb_hid.py new/python-yubico-1.3.2/test/usb/test_yubikey_usb_hid.py
--- old/python-yubico-1.3.1/test/usb/test_yubikey_usb_hid.py 1970-01-01 01:00:00.000000000 +0100
+++ new/python-yubico-1.3.2/test/usb/test_yubikey_usb_hid.py 2016-02-23 12:21:35.000000000 +0100
@@ -0,0 +1,56 @@
+#!/usr/bin/env python
+#
+# Test cases for talking to a USB HID YubiKey.
+#
+
+import struct
+import unittest
+import yubico
+import yubico.yubikey_usb_hid
+from yubico.yubikey_usb_hid import *
+import re
+
+class TestYubiKeyUSBHID(unittest.TestCase):
+
+ YK = None
+
+ def setUp(self):
+ """ Test connecting to the YubiKey """
+ if self.YK is None:
+ try:
+ print("open key")
+ self.YK = YubiKeyUSBHID()
+ return
+ except YubiKeyUSBHIDError as err:
+ self.fail("No YubiKey connected (?) : %s" % str(err))
+
+ def tearDown(self):
+ if self.YK is not None:
+ del self.YK
+
+ #(a)unittest.skipIf(YK is None, "No USB HID YubiKey found")
+ def test_status(self):
+ """ Test the simplest form of communication : a status read request """
+ status = self.YK.status()
+ version = self.YK.version()
+ print("Version returned: %s" % version)
+ re_match = re.match("\d+\.\d+\.\d+$", version)
+ self.assertNotEqual(re_match, None)
+
+ #(a)unittest.skipIf(self.YK is None, "No USB HID YubiKey found")
+ def test_challenge_response(self):
+ """ Test challenge-response, assumes a NIST PUB 198 A.2 20 bytes test vector in Slot 2 (variable input) """
+
+ secret = struct.pack('64s', b'Sample #2')
+ response = self.YK.challenge_response(secret, mode='HMAC', slot=2)
+ self.assertEqual(response, b'\x09\x22\xd3\x40\x5f\xaa\x3d\x19\x4f\x82\xa4\x58\x30\x73\x7d\x5c\xc6\xc7\x5d\x24')
+
+ #(a)unittest.skipIf(self.YK is None, "No USB HID YubiKey found")
+ def test_serial(self):
+ """ Test serial number retrieval (requires YubiKey 2) """
+ serial = self.YK.serial()
+ print("Serial returned : %s" % serial)
+ self.assertEqual(type(serial), type(1))
+
+if __name__ == '__main__':
+ unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-yubico-1.3.1/yubico/yubico_version.py new/python-yubico-1.3.2/yubico/yubico_version.py
--- old/python-yubico-1.3.1/yubico/yubico_version.py 2015-10-01 15:58:55.000000000 +0200
+++ new/python-yubico-1.3.2/yubico/yubico_version.py 2016-02-23 12:21:35.000000000 +0100
@@ -1 +1 @@
-__version__ = "1.3.1"
+__version__ = "1.3.2"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-yubico-1.3.1/yubico/yubikey_frame.py new/python-yubico-1.3.2/yubico/yubikey_frame.py
--- old/python-yubico-1.3.1/yubico/yubikey_frame.py 2015-09-09 17:12:31.000000000 +0200
+++ new/python-yubico-1.3.2/yubico/yubikey_frame.py 2016-02-23 12:21:35.000000000 +0100
@@ -103,25 +103,32 @@
SLOT.UPDATE2,
SLOT.SWAP,
]:
- # annotate according to config_st (see yubikey_defs.to_string())
+ # annotate according to config_st (see ykdef.h)
if yubico_util.ord_byte(data[-1]) == 0x80:
- return (data, "FFFFFFF")
+ return (data, "FFFFFFF") # F = Fixed data (16 bytes)
if yubico_util.ord_byte(data[-1]) == 0x81:
return (data, "FFFFFFF")
if yubico_util.ord_byte(data[-1]) == 0x82:
- return (data, "FFUUUUU")
+ return (data, "FFUUUUU") # U = UID (6 bytes)
if yubico_util.ord_byte(data[-1]) == 0x83:
- return (data, "UKKKKKK")
+ return (data, "UKKKKKK") # K = Key (16 bytes)
if yubico_util.ord_byte(data[-1]) == 0x84:
return (data, "KKKKKKK")
if yubico_util.ord_byte(data[-1]) == 0x85:
- return (data, "KKKAAAA")
+ return (data, "KKKAAAA") # A = Access code to set (6 bytes)
if yubico_util.ord_byte(data[-1]) == 0x86:
- return (data, "AAlETCr")
+ return (data, "AAlETCr") # l = Length of fixed field (1 byte)
+ # E = extFlags (1 byte)
+ # T = tktFlags (1 byte)
+ # C = cfgFlags (1 byte)
+ # r = RFU (2 bytes)
if yubico_util.ord_byte(data[-1]) == 0x87:
- return (data, "rCR")
+ return (data, "rCRaaaa") # CR = CRC16 checksum (2 bytes)
+ # a = Access code to use (6 bytes)
+ if yubico_util.ord_byte(data[-1]) == 0x88:
+ return (data, 'aa')
# after payload
if yubico_util.ord_byte(data[-1]) == 0x89:
return (data, " Scr")
- else:
- return (data, '')
+
+ return (data, '')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-yubico-1.3.1/yubico/yubikey_usb_hid.py new/python-yubico-1.3.2/yubico/yubikey_usb_hid.py
--- old/python-yubico-1.3.1/yubico/yubikey_usb_hid.py 2015-09-30 12:53:22.000000000 +0200
+++ new/python-yubico-1.3.2/yubico/yubikey_usb_hid.py 2016-02-23 12:21:35.000000000 +0100
@@ -151,10 +151,10 @@
self.status()
self._debug("Programmed slot %i, sequence %i -> %i\n" % (slot, old_pgm_seq, self._status.pgm_seq))
- if slot in [SLOT.CONFIG, SLOT.CONFIG2] or old_pgm_seq != 0:
- if self._status.pgm_seq == old_pgm_seq + 1:
- return
- elif self._status.pgm_seq == 1:
+ cfgs = self._status.valid_configs()
+ if not cfgs and self._status.pgm_seq == 0:
+ return
+ if self._status.pgm_seq == old_pgm_seq + 1:
return
raise YubiKeyUSBHIDError('YubiKey programming failed (seq %i not increased (%i))' % \
1
0
Hello community,
here is the log from the commit of package libwebp for openSUSE:Factory checked in at 2016-02-29 09:13:53
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libwebp (Old)
and /work/SRC/openSUSE:Factory/.libwebp.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libwebp"
Changes:
--------
--- /work/SRC/openSUSE:Factory/libwebp/libwebp.changes 2015-12-17 15:52:44.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.libwebp.new/libwebp.changes 2016-02-29 09:15:51.000000000 +0100
@@ -1,0 +2,38 @@
+Fri Feb 12 15:34:04 UTC 2016 - mpluskal(a)suse.com
+
+- Update baselibs.conf
+
+-------------------------------------------------------------------
+Thu Feb 11 15:44:22 UTC 2016 - mpluskal(a)suse.com
+
+- Update to 0.5.0
+ * miscellaneous bug & build fixes (issues #234, #258, #274, #275,
+ #278)
+ * encoder & decoder speed-ups on x86/ARM/MIPS for lossy &
+ lossless
+ + note! YUV->RGB conversion was sped-up, but the results will
+ be slightly different from previous releases
+ * various lossless encoder improvements
+ * gif2webp improvements, -min_size option added
+ * tools fully support input from stdin and output to stdout (issue
+ #168)
+ * New WebPAnimEncoder API for creating animations
+ * New WebPAnimDecoder API for decoding animations
+ * other API changes:
+ + libwebp:
+ WebPPictureSmartARGBToYUVA() (-pre 4 in cwebp)
+ WebPConfig::exact (-exact in cwebp; -alpha_cleanup is now the
+ default)
+ WebPConfig::near_lossless (-near_lossless in cwebp)
+ WebPFree() (free'ing webp allocated memory in other
+ languages)
+ WebPConfigLosslessPreset()
+ WebPMemoryWriterClear()
+ + libwebpdemux: removed experimental fragment related fields
+ and functions
+ + libwebpmux: WebPMuxSetCanvasSize()
+ * new libwebpextras library with some uncommon import functions:
+ WebPImportGray/WebPImportRGB565/WebPImportRGB4444
+- Make building more verbose
+
+-------------------------------------------------------------------
Old:
----
libwebp-0.4.4.tar.gz
libwebp-0.4.4.tar.gz.asc
New:
----
libwebp-0.5.0.tar.gz
libwebp-0.5.0.tar.gz.asc
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ libwebp.spec ++++++
--- /var/tmp/diff_new_pack.qWD5Or/_old 2016-02-29 09:15:52.000000000 +0100
+++ /var/tmp/diff_new_pack.qWD5Or/_new 2016-02-29 09:15:52.000000000 +0100
@@ -17,7 +17,7 @@
Name: libwebp
-Version: 0.4.4
+Version: 0.5.0
Release: 0
Summary: Library and tools for the WebP graphics format
License: BSD-3-Clause
@@ -58,53 +58,66 @@
developers can use WebP to compress, archive and distribute digital
images more efficiently.
-%package -n libwebp5
+%package -n libwebp6
Summary: Library for the WebP graphics format
Group: System/Libraries
-%description -n libwebp5
+%description -n libwebp6
WebP is an image format that does lossy compression of digital
photographic images. WebP consists of a codec based on VP8, and a
container based on RIFF. Webmasters, web developers and browser
developers can use WebP to compress, archive and distribute digital
images more efficiently.
-%package -n libwebpdemux1
+%package -n libwebpdemux2
Summary: Library for extraction of data and images from WebP container files
Group: System/Libraries
-%description -n libwebpdemux1
+%description -n libwebpdemux2
The WebP Demux API enables extraction of images and extended format
data from WebP files. This API currently supports reading of XMP/EXIF
metadata, ICC profile and animated images.
-%package -n libwebpmux1
+%package -n libwebpmux2
Summary: Library for reading/adding data to WebP container files
Group: System/Libraries
-%description -n libwebpmux1
+%description -n libwebpmux2
The WebP Mux API contains methods for adding data to and reading data
from WebP files. This API currently supports XMP/EXIF metadata, ICC
profile and animation.
-%package -n libwebpdecoder1
+%package -n libwebpdecoder2
Summary: Library for decoding WebP graphics format
Group: System/Libraries
-%description -n libwebpdecoder1
+%description -n libwebpdecoder2
WebP is an image format that does lossy compression of digital
photographic images. WebP consists of a codec based on VP8, and a
container based on RIFF. Webmasters, web developers and browser
developers can use WebP to compress, archive and distribute digital
images more efficiently.
+%package -n libwebpextras0
+Summary: Library for decoding WebP graphics format
+Group: System/Libraries
+
+%description -n libwebpextras0
+WebP is an image format that does lossy compression of digital
+photographic images. WebP consists of a codec based on VP8, and a
+container based on RIFF. Webmasters, web developers and browser
+developers can use WebP to compress, archive and distribute digital
+images more efficiently. This package contains shared libraries for less
+common imports - WebPImportGray/WebPImportRGB565/WebPImportRGB4444.
+
%package devel
Summary: Development files for libwebp, a library for the WebP format
Group: Development/Libraries/C and C++
-Requires: libwebp5 = %version
-Requires: libwebpdemux1 = %version
-Requires: libwebpmux1 = %version
-Requires: libwebpdecoder1 = %version
+Requires: libwebp6 = %version
+Requires: libwebpdemux2 = %version
+Requires: libwebpmux2 = %version
+Requires: libwebpdecoder2 = %version
+Requires: libwebpextras0 = %version
%description devel
WebP is an image format that does lossy compression of digital
@@ -119,42 +132,48 @@
%build
%configure --disable-static \
--enable-libwebpmux --enable-libwebpdemux \
- --enable-libwebpdecoder
-make %{?_smp_mflags}
+ --enable-libwebpdecoder --enable-libwebpextras
+make %{?_smp_mflags} V=1
%install
%make_install
rm -f "%buildroot/%_libdir"/*.la
-%post -n libwebp5 -p /sbin/ldconfig
-%postun -n libwebp5 -p /sbin/ldconfig
-%post -n libwebpdemux1 -p /sbin/ldconfig
-%postun -n libwebpdemux1 -p /sbin/ldconfig
-%post -n libwebpmux1 -p /sbin/ldconfig
-%postun -n libwebpmux1 -p /sbin/ldconfig
-%post -n libwebpdecoder1 -p /sbin/ldconfig
-%postun -n libwebpdecoder1 -p /sbin/ldconfig
+%post -n libwebp6 -p /sbin/ldconfig
+%postun -n libwebp6 -p /sbin/ldconfig
+%post -n libwebpdemux2 -p /sbin/ldconfig
+%postun -n libwebpdemux2 -p /sbin/ldconfig
+%post -n libwebpmux2 -p /sbin/ldconfig
+%postun -n libwebpmux2 -p /sbin/ldconfig
+%post -n libwebpdecoder2 -p /sbin/ldconfig
+%postun -n libwebpdecoder2 -p /sbin/ldconfig
+%post -n libwebpextras0 -p /sbin/ldconfig
+%postun -n libwebpextras0 -p /sbin/ldconfig
%files -n libwebp-tools
%defattr(-,root,root)
%_bindir/*
%_mandir/man*/*
-%files -n libwebp5
+%files -n libwebp6
+%defattr(-,root,root)
+%_libdir/libwebp.so.6*
+
+%files -n libwebpdemux2
%defattr(-,root,root)
-%_libdir/libwebp.so.5*
+%_libdir/libwebpdemux.so.2*
-%files -n libwebpdemux1
+%files -n libwebpmux2
%defattr(-,root,root)
-%_libdir/libwebpdemux.so.1*
+%_libdir/libwebpmux.so.2*
-%files -n libwebpmux1
+%files -n libwebpdecoder2
%defattr(-,root,root)
-%_libdir/libwebpmux.so.1*
+%_libdir/libwebpdecoder.so.2*
-%files -n libwebpdecoder1
+%files -n libwebpextras0
%defattr(-,root,root)
-%_libdir/libwebpdecoder.so.1*
+%_libdir/libwebpextras.so.0*
%files devel
%defattr(-,root,root)
++++++ baselibs.conf ++++++
--- /var/tmp/diff_new_pack.qWD5Or/_old 2016-02-29 09:15:52.000000000 +0100
+++ /var/tmp/diff_new_pack.qWD5Or/_new 2016-02-29 09:15:52.000000000 +0100
@@ -1,10 +1,12 @@
-libwebp5
-libwebpdecoder1
-libwebpdemux1
-libwebpmux1
+libwebp6
+libwebpdecoder2
+libwebpdemux2
+libwebpmux2
+libwebpextras0
libwebp-devel
-requires libwebp-<targettype>
- requires "libwebp5-<targettype> = <version>"
- requires "libwebpdecoder1-<targettype> = <version>"
- requires "libwebpdemux1-<targettype> = <version>"
- requires "libwebpmux1-<targettype> = <version>"
+ requires "libwebp6-<targettype> = <version>"
+ requires "libwebpdecoder2-<targettype> = <version>"
+ requires "libwebpdemux2-<targettype> = <version>"
+ requires "libwebpmux2-<targettype> = <version>"
+ requires "libwebpextras0-<targettype> = <version>"
++++++ libwebp-0.4.4.tar.gz -> libwebp-0.5.0.tar.gz ++++++
++++ 46438 lines of diff (skipped)
1
0